动态代理相关知识点
JDK动态代理的核心API#
JDK动态代理提供外部使用的主要依赖两个类:
java.lang.reflect.Proxy
:可以理解为代理类的工厂类(其实也是父类,见下文)。java.lang.reflect.InvocationHandler
:代理实例需要实现的调用处理器接口。
CGLIB动态代理的核心API#
cglib核心类:Enhancer
Enhancer是cglib的字节码增群器, 可以方便的对final类进行扩展, 它动态创建了给定类型的子类,但是拦截了所有非final方法。
callbacks简介
这里的callback可以认为是cglib用于生成字节码的实现手段,cglib一共实现了6种callback,用于对代理类目标进行不同手段的代理,非常灵活,分别为:
- MethodInterceptor:是一个功能强大的接口,类似于AOP中的环绕增强
- FixedValue:是可以让我们很方便的替换掉源方法的返回值
- InvocationHandler:需要实现InvocationHandler接口,实现invoke对象,该拦截传入了proxy对象,用于自定义实现,与MethodInterceptor相似,慎用method的invoke方法。切忌不要造成循环调用
- LazyLoader:就和名字一样,提供了一种懒加载模式,这个类提供的loadObject方法就是实现这种懒加载模式,它会在第一次被调用的时候触发,返回一个代理类的实例,这个实例会被存储起来然后负责所有被代理类方法调用,如果代理类的对象创建比较麻烦且不能确定是否会被使用的时候可以使用这个模式来延迟生成代理。这个懒加载模式会在我们之后试下bean convert的时候大量使用。
- Dispatcher:这个模式和LazyLoader一样,也提供了loadObject方法,这个方法同样也是返回一个实例代理对象。但是不同之处在于Dispatcher的loadObject方法在每次发生对原方法的调用时都会被调用并返回一个代理对象来调用原方法。也就是Dispatcher的loadObject方法返回的对象并不会存储起来,每次调用都会重写再生成新的代理类。可以简单的理解为两种模式的scope域不同,LazyLoader是Singleton单例,Dispatcher是Prototype。
-
NoOp:啥都不干只是调用了原来的方法
重点:从 jdk6 到 jdk7、jdk8 ,动态代理的性能得到了显著的提升,而 cglib 的表现并未跟上,甚至可能会略微下降。传言的 cglib 比 jdk动态代理高出 10 倍的情况也许是出现在更低版本的 jdk 上吧。
JDK动态代理无法代理final修饰的方法。JDK动态代理是基于接口的代理机制,它要求代理类必须实现一个接口。然而,如果一个方法被final修饰,那么它就不能被子类覆盖,这意味着该方法无法在代理类中被拦截或修改。因此,JDK动态代理无法应用于final修饰的方法。相比之下,CGLIB动态代理是通过继承的方式来实现代理的,它也不能代理final修饰的类或方法,因为final类无法被继承。总的来说,无论是JDK动态代理还是CGLIB动态代理,都无法代理final修饰的方法或类
jdk动态代理和cglib动态代理的区别
1、jdk动态代理是实现了被代理对象的接口,cglib是继承了被代理对象。
2、jdk和cglib都是在运行期生成字节码,jdk是直接写class字节码,cglib使用ASM框架写class字节码,cglib代理实现更复杂,生成代理类比jdk效率低。
3、jdk调用代理方法,是通过反射机制调用,cglib是通过FastClass机制直接调用方法,cglib执行效率更高。
下面案例是jdk动态代理可以用,但cglib不行
public final class Buyer2 implements Subject {
@Override
public void buybuybuy() {
System.out.println("小何要买iPhone");
}
}
public interface Subject {
//jdk代理可以使用,
static final String strTest = "232";
// 定义目标对象的接口方法
// 代购物品
public void buybuybuy();
}
参考文档:
https://www.cnblogs.com/throwable/p/12272262.html
https://www.cnblogs.com/duanxz/archive/2012/12/03/2799504.html
原文地址:https://blog.csdn.net/wppwpp1/article/details/142265577
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!