2017-09-15 5 views
0

私はJavaCompilerを使用してクラスのダイナミクスを作成します。このクラスは、指定されたインタフェースを実装します。 JavaCompilerのために、コンパイラが自分のクラスをコンパイルできるように正しいクラスパスを作成することができます。
SecureClassLoaderは依存インタフェースを見つけません

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(間違った名前を

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

私は匿名のクラスローダを使用します:refac/MyClass)

クラスローダーのコンパイラタスクに設定したのと同じクラスパスを設定することはできますか?

答えて

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メソッドが必要です。

関連する問題