2016-12-18 3 views
1

나는 향상된 오브젝트 BCEL를 사용하여이 방법 CGLIB의 바이트 코드를 얻으려고 :cglib 프록시 클래스 인스턴스의 바이트 코드를 가져 오는 방법은 무엇입니까?

package app; 

import cglib.MyInterceptor; 
import net.sf.cglib.proxy.Enhancer; 
import org.apache.bcel.Repository; 
import org.apache.bcel.classfile.JavaClass; 
import org.apache.bcel.classfile.Method; 
import service.Tool; 

public class CgLibApp { 
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { 
     // target object 
     Tool tool = new Tool(); 

     // proxying 
     Enhancer e = new Enhancer(); 
     e.setSuperclass(tool.getClass()); 
     e.setCallback(new MyInterceptor(tool)); 
     Tool proxifiedTool = (Tool) e.create(); 

     // trying to get proxy byte code 
     JavaClass clazz = Repository.lookupClass(proxifiedTool.getClass()); 
     Method method = clazz.getMethod(Tool.class.getMethod("meth")); 

     System.out.println(method.getCode().toString()); 
    } 
} 

을하지만 점점 해요 :

Exception in thread "main" java.lang.ClassNotFoundException: SyntheticRepository could not load service.Tool$$EnhancerByCGLIB$$22a3afcc 
at org.apache.bcel.util.SyntheticRepository.loadClass(SyntheticRepository.java:174) 
at org.apache.bcel.util.SyntheticRepository.loadClass(SyntheticRepository.java:158) 
at org.apache.bcel.Repository.lookupClass(Repository.java:74) 
at app.CgLibApp.main(CgLibApp.java:21) 

내가 향상된 개체에서 바이트 코드를 얻으려면 어떻게해야합니까?

답변

0

BCEL은 .class 파일에 대한 클래스 로더를 조회하여이를 나타내는 바이트 배열을 확보합니다. 이러한 클래스 파일은 동적으로 생성 된 클래스에는 존재하지 않습니다.

클래스 파일을 유지하려면 클래스 파일을 만드는 동안 바이트 코드를 수집해야합니다. Cglib은 ASM 위에 구축되며 클래스 파일을 수집하기 위해 자신의 ClassVisitor을 등록 할 수 있습니다.

EnhancergenerateClass(ClassVisitor) 메서드를 사용하고 후자의 메서드는 ClassWriter으로 지정합니다. 이 메소드를 호출 한 후에는 전달한 클래스 작성기 객체에서 바이트 코드를 가져올 수 있습니다.

관련 문제