2016-10-22 7 views
0

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); 
    } 
} 

答えて

0

あなたのインターフェース(DoStuff )はSystemClassLoaderによってロードされません。通常、アプリケーションクラスローダによってロードされます。

次DoStuff使用の文脈でのHelloWorldを利用できるようにしたい場合は、

DynamicClassLoaderののCL =新しいDynamicClassLoaderの(DoStuff.class.getClassLoader());

関連する問題