下载.class文件并将其加载到JVM中

时间:2014-04-24 07:41:39

标签: java class jvm classloader

如何使用类加载器下载.class文件并将其加载到jvm中,我编写了一个简单的代码模拟下载.class文件,我试图将其加载到JVM中

public class face {
public static void main(String[] args) throws IOException,
        ClassNotFoundException {

    File f = new File("Task.class");

    int count;
    byte[] buffer = new byte[1024];
    DataInputStream dis = new DataInputStream(new FileInputStream(f));
    StringBuilder all = new StringBuilder();
    while ((count = dis.read(buffer)) > 0) {
        // System.out.write(buffer, 0, count);
        all.append(buffer);
        // System.out.flush();
    }
    File b = new File("Task.class");
    FileOutputStream fos = new FileOutputStream(b);
    DataOutputStream dos = new DataOutputStream(fos);
    dos.write(all.toString().getBytes());
    ClassLoader lod = face.class.getClassLoader();
    lod.loadClass(b.getAbsolutePath());

}
}

2 个答案:

答案 0 :(得分:0)

使用Class.forName(<package_qualified_class_name>)

答案 1 :(得分:0)

首先,我想在这里建议一长串的建议,但你已经设法将一大堆错误塞进一小段代码中。

我建议不要做这些事情

  • 如果不添加任何内容,请不要使用DataInputStream或DataOutputStream。您不使用任何需要它的方法。
  • 不要将二进制数据写入StringBuilder。 StringBuilder用于文本。
  • 如果只阅读其中的一部分,请不要复制整个缓冲区。即你需要记录实际读取的长度并仅复制使用的数量。
  • 不要将字节[]附加到StringBuilder。它不会做你期望的。
  • 不要使用String来存储二进制数据。
  • 不要使用默认编码将String转换为byte [],除非你知道你有ASCII数据(你不知道)
  • 不要写入您刚刚阅读的文件。因为这没有意义。你应该在没有文件副本的情况下对这个工作进行测试,你会发现这在你尝试更复杂的事情之前没有用。
  • 您无法写入仍在Windows中打开的文件。我建议你在完成文件后关闭()文件。
  • 不要尝试使用文件名加载类。您可以通过package.class名称加载它。

我建议您尝试使用一个班轮来首先加载课程并显示此作品。该类应该出现在您的类路径中,当您写入该文件时,您应该将其写入适合该包的目录。

您可以在类路径中添加http://yourserver/basepath而不是执行所有操作,而是从Web服务加载类。即,您可以在不编写任何代码的情况下执行此操作。