簡體   English   中英

在運行時加載內部類

[英]Loading inner classes at runtime

我有一個程序,我編譯有人在文本框中寫入的java代碼,然后運行它。 他們輸入完整的源代碼,類和所有

我將他們編寫的類保存到隨機的java源文件中,然后通過類加載器編譯並加載該類。 這非常有效。

我有一個新問題,即子類的問題。 我給外部類一個唯一的名稱,並加載該類。

防爆。

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 ,data是表示類文件的字節。 這適用於外部類。

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

嘗試動態操作類路徑以添加.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 );

API規范看 ,當您發送到defineClass的名稱與由bytes表示的類的二進制名稱不匹配時,將拋出NoClassDefFoundError

您可以嘗試為內部類的className傳遞null。

我最終的解決方案,我是界面:

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

以前,我使用的是一些舊文檔,這些文檔只會使整個過程變得復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM