2011-08-02 70 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