java如何获取cglib代理类实例的字节码?
我正在尝试使用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)
我应该怎么做才能从增强对象中获取字节码
# 1 楼答案
BCEL查询类加载器中的
.class
文件,以获取表示该文件的字节数组。动态生成的类不存在这样的类文件为了获得类文件,必须在创建类文件的过程中收集字节码。Cglib构建在ASM之上,它允许您注册自己的
ClassVisitor
来收集类文件对于
Enhancer
,使用generateClass(ClassVisitor)
方法并将后一种方法交给ClassWriter
。调用该方法后,可以从传递的class writer对象获取字节码# 2 楼答案
下面是打印生成的CGLIB类的伪代码的示例代码。 visitEnd方法以文本格式打印生成的类