cglib

代理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
【cglib】JDK Proxy:是使用反射来调用target对象的原始方法,性能不如cglib,但是生成的速度比cglib快。

    推荐阅读