代理5 cglib 概述
https://www.jianshu.com/p/27484d2c47d3
代理6 cglib KeyFactory
https://www.jianshu.com/p/75e328787680
/**
* 类说明
* System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class"); --该设置用于输出cglib动态代理产生的类
* System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); --该设置用于输出jdk动态代理产生的类
*
* @author hanwen.mei@msxf.com
* @version CglibTest1.java, 2019/11/30 16:13
*/
public class CglibTest1 {
@Test
public void testFixedValue() throws Exception {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\\work\\gitlab\\cloud\\aoptest\\classout");
System.out.println("start ====================== ");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SampleClass.class);
enhancer.setCallback(new FixedValue() {
@Override
public Object loadObject() throws Exception {
return "Hello cglib!";
}
});
SampleClass proxy = (SampleClass) enhancer.create();
assertEquals("Hello cglib!", proxy.test(null));
}
}
public class SampleClass {
public String test(String input) {
System.out.println("Sample class test() invoke");
return "Hello world!";
}
public String hahah(String input) {
System.out.println("Sample class hahah() invoke");
test("aa");
return "hahah!";
}
}
public class EnhancerSampleClass extends SampleClass {
@Override
public String test(String input) {
System.out.println("enhance test method!!!");
// methodProxy.invoke -> origintest
return origintest(input);
}
@Override
public String hahah(String input) {
System.out.println("enhance hahah method!!!");
return originhahah(input);
}
public String origintest(String input) {
return super.test(input);
}
public String originhahah(String input) {
return super.hahah(input);
}
public static void main(String[] args) {
SampleClass enhancerSampleClass = new EnhancerSampleClass();
enhancerSampleClass.hahah("aa");
}
}
private static class FastClassInfo
{
FastClass f1; // net.sf.cglib.test.Target的fastclass
FastClass f2; // Target$$EnhancerByCGLIB$$788444a0 的fastclass
int i1; //方法g在f1中的索引
int i2; //方法CGLIB$g$0在f2中的索引
}
cglib和aop的重要区别
cglib:是根据方法建立索引来快速调用到target对象的原始方法。通过FastClassInfo,建立的过程可能比较耗时,但是建立好之后访问比较快。
https://www.cnblogs.com/cruze/p/3865180.html
JDK Proxy:是使用反射来调用target对象的原始方法,性能不如cglib,但是生成的速度比cglib快。
网友评论