2017-09-15 31 views
0

我使用JavaCompiler創建一個動態類。這個類實現了一個給定的接口。對於JavaCompiler,我可以創建一個正確的類路徑,以便編譯器可以編譯我的類。

SecureClassLoader找不到依賴接口

//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

我找到了解決方案。
我不僅需要使用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方法。