Tomcatでは、クラスローダーを消費してHelloWorldをロードします。ClassLoader.getSystemClassLoader()を使用するときにclassnotfoundexceptionを取得しました
sb.append("package XXXX.XXXXX.XXXX.freemarkerjob;\n");
sb.append("import XXXX.XXXXX.XXXX.freemarkerjob.DoStuff;\n");
sb.append("public class HelloWorld implements DoStuff {\n");
sb.append(" public void doStuff() {\n");
sb.append(" System.out.println(\"Hello world\");\n");
sb.append(" }\n");
sb.append("}\n");
Class<?> helloClass = InMemoryJavaCompiler.compile("XXXX.XXXXX.XXXX.HelloWorld", sb.toString(), optionList);
そして、私はにThread.currentThread()を使用している場合、私が見つかりました。getContextClassLoader()DynamicClassLoaderの者の親として、私は成功し、しかし私の使用ローダ(ClassLoader.getSystemClassLoader()が、それはClassNotFoundExceptionがスローする場合、クラスをロードすることができますときHelloWorldのは、それを実装するためにどの、インターフェイスDoStuffをロードに失敗しまし方法cl.loadClass(クラス名)を;,呼び出す。 私はにSystemClassLoaderがインタフェースをロードすることはできません理由を知っておくべきこと?
DynamicClassLoader cl = new DynamicClassLoader(Thread.currentThread().getContextClassLoader());
DynamicClassLoader cl = new DynamicClassLoader(ClassLoader.getSystemClassLoader());
Class<?> helloClass = InMemoryJavaCompiler.compile("XXXX.XXXXX.XXXX.HelloWorld", sb.toString(), optionList);
public static Class<?> compile(String className, String sourceCodeInText, Iterable<String> options) throws Exception {
This one successfully
DynamicClassLoader cl = new DynamicClassLoader(Thread.currentThread().getContextClassLoader());
This one failed
// DynamicClassLoader cl = new DynamicClassLoader(ClassLoader.getSystemClassLoader());
cl.loadClass(className);
}
package XXXX.XXXXX.XXXX.dynamicjava;
import java.util.HashMap;
import java.util.Map;
public class DynamicClassLoader extends ClassLoader {
private Map<String, CompiledCode> customCompiledCode = new HashMap<>();
public DynamicClassLoader(ClassLoader parent) {
super(parent);
}
public void setCode(CompiledCode cc) {
customCompiledCode.put(cc.getName(), cc);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
CompiledCode cc = customCompiledCode.get(name);
if (cc == null) {
Class<?> curClass = super.findClass(name);
if (curClass == null) {
return null;
} else {
return curClass;
}
}
byte[] byteCode = cc.getByteCode();
return defineClass(name, byteCode, 0, byteCode.length);
}
}