静态代理与动态代理的区别
编译时机
静态代理:运行前,代理类已被编译为class文件
动态代理:运行时,动态生成代理类的class文件
可扩展性
静态代理:每次需要代理新的接口/类实例都需要编写新的代理类,每需要在现有接口/类添加新的方法都需要修改代理类
动态代理:代理类可以代理任何类/接口实例 /方法 (对类/接口和方法进行抽象)
JDK和cglib的区别
适用情况
JDK:继承了接口的目标类
cglib:没有限制
实现方式
JDK:
- 实现InvocationHandler接口,重写invoke()来添加新功能
- 通过Proxy.newProxyInstance()生成代理对象
cglib:
- 实现MethodInterceptor接口,重写intercept()来添加新功能
- 通过Enhancer实例的create()生成代理对象
原理
JDK: 代理类实现目标接口,通过反射生成代理接口的匿名类对象,调用InvocationHandler的invoke方法来添加新功能
cglib:代理类继承目标类,通过ASM生成代理类字节码并加载到JVM生成子类对象,重写父类方法,调用MethodInterceptor的intercept方法来添加新功能