我正在尝试使用BCEL以这种方式获取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)


我应该怎么做才能从增强对象中获取字节码?

最佳答案

BCEL向类加载器查询.class文件,以获取表示该文件的字节数组。对于动态生成的类,这种类文件不存在。

为了掌握类文件,必须在创建类文件的过程中收集字节码。 Cglib建立在ASM之上,它允许您注册自己的ClassVisitor来收集类文件。

对于Enhancer,请使用generateClass(ClassVisitor)方法,并将后一种方法交给ClassWriter。调用该方法后,您可以从传递的类编写器对象中获取字节码。

关于java - 如何获取cglib代理类实例的字节码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41210938/

10-09 01:58
查看更多