2010-11-23 3 views
7
ClassWriter cw = new ClassWriter(...); 
byte[] bytes = cw.toByteArray(); 

bytes 배열에서 새 클래스 인스턴스를 만들고 싶습니다. 어떻게해야합니까? 전혀 가능합니까?Java : 바이트 코드의 새 인스턴스

+1

가능한 복제본 [Java : JVM에 \ [\] 바이트로 저장된 클래스를로드하는 방법?] (http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- jvm으로 바이트로) –

+0

@ bruno 콘데 : 그것은 보인다. 여기서보다 간결한 방식으로 표현할 것입니다. –

+0

defineClass를 사용할 수 있습니다 만, 커스텀 클래스 로더를 사용하지 않는 한, 리플렉션을 사용하여 public 메소드가 아닌 그것을 호출해야 할 수도 있습니다. –

답변

8
+1

좋은 답변이지만 끔찍한 서식과 자바 1.4 링크. 둘 다 변경되었습니다. –

+0

편집 해 주셔서 감사합니다.하지만 파서는 링크를 제대로 표시하고 싶지 않았습니다. –

+3

+1. 어쨌든, 메서드는 보호되어 있으므로 액세스 할 방법이 필요합니다. ClassLoader를 확장하고 public 메소드를 제공하는 것이 해결책이 될 수 있습니다. –

2

이 가능하며, 당신이 이것을 달성하기 위해 반사를 사용해야합니다. 가짜 코드는 다음과 같습니다.

final Class clazz = loadIntoCurrentClassLoader(bytes); //I'm assuming you wrote this already using defineClass 

final YourClass foo ; 
try { 
    foo = (YourClass) clazz.newInstance(); 
} 
catch (final Exception e) { 
    throw new RuntimeException(e); 
} 
+0

나는'loadIntoCurrentClassLoader (bytes)'부분이 질문에 대한 것임을 확신한다 : –

+0

그래, 나는 조금 배 갔다;) –

+0

질문이 표현되는 방식이 모호하다. –

0

ClassLoader를 확장하고 defineClass를 사용하여 클래스를 만들 수 있습니다. 하지만 생성 된 클래스에는 확장 클래스 로더 (ClassLoader)가 ClassLoader로 포함되어있어 클래스의 코드가 다른 클래스를로드 할 때 오류가 발생합니다. 아마 모든 것을 올바른 방식으로 위임하도록 ClassLoader를 작성하여이 문제를 해결할 수 있지만이 권한을 얻는 방법은 분명하지 않습니다.

관련 문제