我使用JavaCompiler创建一个动态类。该类实现给定的接口。对于JavaCompiler,我可以创建一个正确的类路径,以便编译器可以编译我的类。
//creating the classpath from parent application to be same as the runtime's
ClassLoader dummyc=getClass().getClassLoader();
URLClassLoader urlClassLoader=(URLClassLoader)dummyc;
URL[] urls=urlClassLoader.getURLs();
String classpath = "";
for (URL i : urls) {
classpath += ";" + i.getPath().substring(1);
}
我使用匿名类加载器:
return new SecureClassLoader() {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = javaClassObject.getBytes();
return super.defineClass(name, javaClassObject.getBytes(), 0, b.length);
}
};
加载已编译的类,但是当我调用loadClass方法时,我收到此错误:
NoClassDefFoundError:refac / IBewertungsAlgorithmus(错误名称:refac / MyClass)
是否可以为类加载器设置为编译器任务设置的相同类路径?
答案 0 :(得分:0)
我找到了解决方案。
我不仅需要使用SecureClassLoader,还需要父类的ClassLoader及其所有依赖项。
public ClassLoader getClassLoader(Location location) {
ClassLoader cl = DynamicCompiler.class.getClassLoader();
return new SecureClassLoader() {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = javaClassObject.getBytes();
if (name.contains("MyClass")){
return super.defineClass(name, javaClassObject.getBytes(), 0, b.length);
} else {
return cl.loadClass(name);
}
}
};
}
findclass的第一次调用搜索已编译的类,因此我必须调用SecureclassLoader的defineClass。
以下调用用于编译类的依赖项。要加载这些类,您需要父类加载器的loadClass方法。