2011-08-02 2 views
3

누군가가 텍스트 상자에 쓴 Java 코드를 컴파일하고 실행하는 프로그램이 있습니다. 그들은 전체 소스 코드, 클래스 및 모두를 입력합니다.런타임에 내부 클래스로드

나는 그들이 임의의 자바 소스 파일에 쓰는 클래스를 저장 한 다음 클래스 로더를 통해 클래스를 컴파일하고로드합니다. 이것은 완벽하게 작동합니다.

하위 클래스의 새로운 문제가 있습니다. 외부 클래스에 고유 한 이름을 지정하고 해당 클래스를로드합니다.

Ex. 내부 클래스와

TEMP1110.java -> TEMP1110.class 등 , 그것은 TEMP1110$InnerClass.class 내 클래스 로더를 통해이 클래스를로드하려고 로 컴파일하지만, 외부 클래스가를 호출합니다 때 : java.lang.NoClassDefFoundError: TEMP1110$InnerClass : new InnerClass().method();

그것을 나에게이 있습니다

이상한 점이나 잘못하고있는 것이 있습니까?

내 클래스 로더는 :

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

Mistype. 잘 잡으세요! – 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 파일이있는 폴더 추가 클래스 경로를 조작하십시오 : 당신이 defineClass는로 전송 이름이 이진과 일치하지 않을 때 NoClassDefFoundError가 슬로우되는 것 같습니다,

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에서을 바이트로 나타내지는 클래스의 이름

내부 클래스에 대해 className에 null을 전달할 수 있습니다. 내가 인터페이스 인과

관련 문제