저는 현재 사용자 정의 ORM 프레임 워크를 개발 중이며 ASM을 사용하여 런타임시 하위 클래스를 동적으로 생성합니다. 생성 과정은 정상적으로 완료된 것으로 보이지만 결과 클래스를 인스턴스화하려고하면 "NoClassDefFoundError"가 발생합니다.런타임에 서브 클래스를 동적으로 생성합니다.
오류는 실제 하위 클래스가 아니라 Super 클래스와 관련이있는 것 같습니다.
/**loads the generated proxy class from the provided bytes. */
private Class loadProxyClass(byte[] aGeneratedProxyClass,String proxyClassName) throws ClassNotFoundException{
return new ProxyClassLoader(Thread.currentThread().getContextClassLoader(),aGeneratedProxyClass)
.loadClass(this.convertToExternalName(proxyClassName));
}
:
이
private Class generateProxyClass(Class anEntitySuperClass,
List<Field> fieldsToIntercept) throws ClassNotFoundException{
String entitySuperClassName = this.convertToInternalName(anEntitySuperClass.getName());
//String entityProxySubClassName = "com/flux/dynamic/".concat(anEntitySuperClass.getSimpleName()).concat("Proxy");
String entityProxySubClassName = anEntitySuperClass.getSimpleName().concat("Proxy");
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
cw.visit(V1_6,ACC_PUBLIC+ACC_SUPER,entityProxySubClassName,null,entitySuperClassName,null);
cw.visitSource(entityProxySubClassName.concat(".java"),null);
//create constructor
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC,"<init>","()V",null,null);
mv.visitCode();
//have our consturctor initailise its super class.
mv.visitVarInsn(ALOAD,0);
mv.visitMethodInsn(INVOKESPECIAL,entitySuperClassName,"<init>","()V");
mv.visitInsn(RETURN);
mv.visitMaxs(0,0);
mv.visitEnd();
this.generateAndAppendProxyAccessorMethods(anEntitySuperClass,fieldsToIntercept, cw);
cw.visitEnd();
//at this point our class should be fully generated an include all required fields. next we
//convert the class to a byte array and pass it in to our helper method to load an
//actual class from the byte array.
return this.loadProxyClass(cw.toByteArray(),entityProxySubClassName);
}
위라는 "loadProxyClass"방법은 기본적으로 동적으로 생성 된 클래스를로드하기 위해 사용자 정의 클래스 로더를 을 인스턴스화하고 호출하는 도우미 메서드입니다 : 여기에 서브 클래스 생성 방법에서 발췌 한 것입니다
ProxyClassLoader은 단순히 클래스 로더를 확장하고 동적으로 생성 된 클래스 바이트를로드하기 위해 "(때문에) findClass"메소드를 오버라이드 (override) :
public class ProxyClassLoader extends ClassLoader {
private byte[] rawClassBytes;
public ProxyClassLoader(ClassLoader parentClassLoader,byte[] classBytes){
super(parentClassLoader);
this.rawClassBytes = classBytes;
}
@Override
public Class findClass(String name) {
return defineClass(name,this.rawClassBytes, 0,this.rawClassBytes.length);
}
}
을
내가 오류는 다음과 같습니다 Exception in thread "main" java.lang.NoClassDefFoundError: DummyEntity (wrong name: DummyEntityProxy)
DummyEntity
내가
generateProxyClass
방법으로 통과 슈퍼 클래스입니다
하고 DummyEntityProxy
내가 생성을 시도하고있어 클래스입니다. 나는 도움을 청하게 될 것입니다. 클래스 DummyEntity
를로드 할 것으로 예상
Exception in thread "main" java.lang.NoClassDefFoundError: DummyEntity (wrong name: DummyEntityProxy)
클래스 로더를하지만 링크 된 자원은 DummyEntityProxy
라는 이름의 클래스를 포함 :
추가 참조 용 : Java 8에서는 검증 자 오류 메시지가 훨씬 쉽게 읽을 수있게되었습니다. –