2011-08-02 69 views
3

我有一個程序,我在其中編譯有人在文本框中寫入的java代碼,並運行它。 他們輸入完整的源代碼,類和所有在運行時加載內部類

我將它們寫入的類保存到一個隨機java源文件中,然後通過類加載器編譯並加載該類。這工作完美。

雖然我有一個新的問題,那就是子類。我給外部類一個唯一的名稱,並加載該類。

Ex。

TEMP1110.java -> TEMP1110.class等 用內部類,它編譯爲TEMP1110$InnerClass.class 我試圖通過我的類加載器加載這個類,但外部類使得對它的調用時:new InnerClass().method();

它給了我這樣的:java.lang.NoClassDefFoundError: TEMP1110$InnerClass

是否有一些怪癖或我做錯了什麼?

我的類裝載器:

private static class JClassLoader extends ClassLoader { 
    public Class buildClass(final byte[] data, final String className) { 
     return (Class) defineClass(className, data, 0, data.length); 
    } 
} 

classNameTEMPCLASS$InnerClass,並且數據是代表類文件的字節數。這適用於外部類。

+1

愚蠢的一點,但你已經把它編譯爲TEMP1110 $ InnerClass.java。這是一個錯誤類型,還是它需要的問題.class,它有錯誤的文件名? – berry120

+0

錯誤類型。接得好! – kazoo

+0

如果內部類不是靜態的,你不需要首先加載外部類嗎?看到這裏:http://stackoverflow.com/questions/2868337/java-how-to-load-a-class-and-its-inner-classes-that-is-already-on-the-class-pa – berry120

回答

0

我的最終解決方案,我是接口:

ClassLoader cl = new URLClassLoader(new URL[] {new File("TEMP/").toURI().toURL()}); 
Class classd = cl.loadClass(className); 
return (I) classd.newInstance(); 

以前,我是用一些老的文檔只是複雜的全過程。

0

我想'新的InnerClass()'使用普通的類加載和類路徑搜索來查找類。由於您生成的.class文件不在classpath上,因此無法找到它。

嘗試動態操縱類路徑添加您的文件夾在您的.class文件駐留:

String currentPath = System.getProperty("java.library.path"); 
System.setProperty("java.library.path", current + ":/path/to/my/classfiles"); 

// this forces JVM to reload "java.library.path" property 
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); 
fieldSysPath.setAccessible(true); 
fieldSysPath.set(null, null); 
+0

謝謝對於這些建議,我將會調查這些情況並儘快報告。 – kazoo

0

API spec,它看起來像當您發送到的defineClass名稱不匹配二進制NoClassDefFoundError拋出由字節表示的類的名稱。

您可以嘗試爲內部類傳遞null作爲className