先理解这几个概念
reflect、jdk-proxy、cglib-proxy、asm/javassist
示例代码
reflect反射
- 不使用new关键字创建对象
- 反射创建对象分两步
- 1.加载class
GoodsService.class 或者 Class.forName("com.example.GoodsService")
- 2.创建对象
使用默认的构造器生成对象clazz.newInstance()
使用私有构造器生成对象1
2
3Constructor constructor = clazz.getDeclaredConstructor()
constructor.setAccessible(true);
Object object = constructor.newInstance();
- 1.加载class
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动态代理,是通过原类生成代理类,然后生成对象
- jdk动态代理,是通过原对象生成代理对象;
问题
- 1.cglib与jdk-proxy是否生成新class???
- 2.使用什么方式去实现aop的??(reflect还是asm还是其他的)