在运行时编译java文件并使用它得到ClassNotFoundException

时间:2017-02-08 22:30:32

标签: java runtime

所以我试图发送一个类的对象,客户端有一个接口但是没有从服务器到客户端的实现以及该类的实现为客户端在运行时编译。到目前为止我得到的是:

  • 向客户
  • 发送Class.java
  • 编译了它,获得了Class.class个文件
  • 将对象发送到客户端

我在这里得到ClassNotFoundException,即使编译我发送的文件工作得很好。任何人都知道在为客户端编译文件之后还需要做些什么来接受新编译的类作为其中的一个?

代码

// sending file over via socket and saved it as Class.java
String fileName = "C:\\Users\\A\\workspace\\Project\\src\\Class.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, fileName);
if(result == 0) {
    System.out.println("compiler success"); // just to check if the compiler is fine
}

URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("C:\\Users\\A\\workspace\\Project\\src").toURI().toURL()});
Class<?> loadedClass = classLoader.loadClass("Class");

ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
Object returnObj = loadedClass.cast(is.readObject()); // got ERROR: Exception in thread "main" java.lang.ClassNotFoundException: Class

1 个答案:

答案 0 :(得分:0)

反序列化对象时需要使用ClassLoader。目前,ObjectInputStream正在使用系统类加载器,它的类路径上没有Class

将类加载器设置为上下文类加载器可能有所帮助。

请更改班级名称,并使用套餐。您还应该调查RMIClassLoader,其中包含了许多这些操作。