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 [email protected]
* @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快。

你可能感兴趣的:(cglib)