java-jdk与cglib代理

先理解这几个概念

reflect、jdk-proxy、cglib-proxy、asm/javassist
示例代码

reflect反射

  • 不使用new关键字创建对象
  • 反射创建对象分两步
    • 1.加载class
      GoodsService.class 或者 Class.forName("com.example.GoodsService")
    • 2.创建对象
      使用默认的构造器生成对象 clazz.newInstance()
      使用私有构造器生成对象
      1
      2
      3
      Constructor constructor = clazz.getDeclaredConstructor()
      constructor.setAccessible(true);
      Object object = constructor.newInstance();

javassist、asm

  • 字节码操作框架
  • 直接生成字节码流 ==> 类加载器 ==> 对象
    1
    2
    3
    4
    5
    <dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.0.GA</version>
    </dependency>

jdk-proxy

java.lang.reflect.Proxy可根据原对象生成代理对象;
java.lang.reflect.InvocationHandler可以代理对象方法调用过程中织入新逻辑

cglib-proxy

org.springframework.cglib.proxy.Enhancer可增强原类生成代理类;

AOP

  • 对现有类功能的增强;
  • 实现方式:生成一个增强后的class、或者在方法调用时增加逻辑
  • 实现途径:
    1、织入静态代码 (javassit/asm都能生成新class)
    2、调用过程中加逻辑(reflect)

jdk-proxy与cgib对比

  • 1.使用场景:
    • jdk动态代理,只能代理接口;cglib动态代理,所有类都能
    • 都能实现AOP
  • 2.实现方式
    • jdk动态代理,是通过原对象生成代理对象;
      cglib动态代理,是通过原类生成代理类,然后生成对象

问题

  • 1.cglib与jdk-proxy是否生成新class???
  • 2.使用什么方式去实现aop的??(reflect还是asm还是其他的)