2011-03-25 1 views
3

내가 (내 자신의 클래스 로더에서)이 방법이 있습니다사용자 정의 자바 클래스 로더 및 내부 클래스

ZipInputStream in = new ZipInputStream(new FileInputStream(zip)); 
ZipEntry entry; 
while ((entry = in.getNextEntry()) != null) { 
    if (!entry.isDirectory()) { 
     byte[] buffer = new byte[(int) entry.getSize()]; 
     in.read(buffer); 
     if (!entry.getName().endsWith(".class")) 
      continue; 
     String name = entry.getName().replace(".class", "").replace("/", "."); 
     Class<?> cls = this.defineClass(name, buffer, 0, buffer.length); 
     this.resolveClass(cls); 
    } 
} 

로드하려고 메신저 우편은 다음과 같습니다

TestClass.class 
TestClass$SomeOtherInnerClass.class 

내 문제는 defineClass()가 TestClass $ SomeOtherInnerClass를로드하지 못한다는 것입니다. 이 클래스는 실제의 TestClass 전에로드되면 난이 얻을 :

java.lang.ClassFormatError: Wrong InnerClasses attribute length in class file TestClass 

내가 해요 것이 있습니다 :

java.lang.NoClassDefFoundError: TestClass 

나는 또한 먼저 TestClass.class을로드하지만이 오류가 메신저 시도 잘못하고있는거야?

+0

내부 클래스를로드 할 수있는 동일한 문제가 있습니까? 내 클래스 A가 올바르게로드되었지만 클래스 A $ b1이 없습니다 ... 내부 클래스를로드하는 방법을 찾지 못했습니다. 진행? – jrey

답변

3

ClassLoader.findClass()을 무시하지 못할 수도 있습니다. 그렇게하지 않으면 확장하려는 ClassLoader이 이러한 클래스를 찾는 방법을 알지 못합니다.

해당 기능을 클래스의 private static Map<String, Class<?>>에서 간단히 조회하는 것으로 덮어 씁니다. 각 클래스를로드 할 때지도에 넣으십시오.

올바른 순서로 클래스를로드하는 데 어려움이 있습니다. 현재 구현에서는 Zip 검색으로 돌아가서 새로운 findClass() 메서드에서 defineClass()을 호출 할 수 없기 때문입니다.

+0

내 현재 코드는 다음과 같습니다 : [link] (http://pastebin.com/raw.php?i=ngE2DJK9)하지만 TestClass를 먼저로드하려고하면 내 문제가 계속 발생합니다. 먼저 내부 클래스를 찾을 수 없기 때문에 오류가 발생합니다. 클래스 (아직 정의되지 않음)이 문제를 해결하는 방법을 모르겠습니다./ –

+0

@sidd 여기에 코드를 게시 할 수 있습니까? – Jonathan

0

버퍼를 완전히 읽지 않아야하고 (ZipEntry.getSize-1을 반환 할 수 있음) 적어도 하나의 버그가 있습니다.