• 代理模式机制

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。 代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 续处理。

文章开始之前,先给大家来张图,看看静态代理机制原理,

JDK代理与CGLIB代理那点事儿
解释如下:

1 Subject 是实现类与代理类的接口

2 ImplProxy与SubjectImpl表示代理与实现类

3doSth是实现类与代理类的公用方法

  • 静态代理实现

先给大家来个接口,改接口就干一件事,如下:

JDK代理与CGLIB代理那点事儿

赶紧的,再来个实现类(有些时候,也被叫做委托类):

JDK代理与CGLIB代理那点事儿

下面在赶紧写个静态代理,重要事情点一下:

JDK代理与CGLIB代理那点事儿

改代理类也实现了上述接口,并且还增加了两个修饰性的方法,before与after,除了与实现类有共同的run方法以外,这两个方法起到功能增强效果

下面赶紧写个main方法测试一下吧:

JDK代理与CGLIB代理那点事儿

 

所以,明白了吧,静态代理是在编译器实现的,而且静态代理类写死了,下次万一接口有了变动,那么实现,代理都会跟着遭殃,不靠谱啊.

 

  • 动态代理

动态代理实现机制如下图:

JDK代理与CGLIB代理那点事儿

java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:

  1. Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理 类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽 象方法在代理类中动态实现。
  2. Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject。
  3. Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
  4. Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个 代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
  5. Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用 (可使用被代理类的在Subject接口中声明过的方法)。

 

  • JDK动态代理

JDK代理实现是java动态代理中比较常用的一种动态代理方式,一般比较适合接口单一的场景中,

赶紧上代码:

JDK代理与CGLIB代理那点事儿

JDK代理与CGLIB代理那点事儿

如上图,JDK动态代理实现了InvocationHandler这个接口,其中target表示委托类

JDK代理与CGLIB代理那点事儿

JDK动态代理的实现方式如上图

  • jdk动态代理使用的局限性

通过反射类ProxyInvocationHandler回调接口实现的jdk动态代理,要求委托类必须实现一个接口,但事实上并不是所有类都有接口,对于没有实现接口的类,便无法使用该方方式实现动态代理。

 

  • CGLIB动态代理

CGLib 给我们提供的 MethodInterceptor 实现类,并填充 intercept() 方法。方法中最后一个 MethodProxy 类型的参数 proxy,值得注意!CGLib 给我们提供的是方法级别的代理,也可以理解为对方法的拦截(这不就是传说中的“方法拦截器”吗?)。这个功能对于我们这群屌丝程序员而言,如同雪中送炭啊,此乃神器也!我们直接调用 proxy 的 invokeSuper() 方法,将被代理的对象 obj 以及方法参数 args 传入其中即可

直接上图:

JDK代理与CGLIB代理那点事儿

JDK代理与CGLIB代理那点事儿

JDK代理与CGLIB代理那点事儿

可以看出,CGLIB代理要比JDK动态代理更加灵活,对委托类进行了统一管理,不再仅仅依赖于接口,对于没有借口的类也能动态实现!

今天就到此为止,祝大家有个美好的周末!同样也期待您的留言。

 

转载于:https://my.oschina.net/yaukie/blog/851814

相关文章:

  • 2021-12-09
  • 2022-02-02
  • 2021-12-30
  • 2022-12-23
  • 2021-12-22
  • 2021-07-16
  • 2021-11-17
  • 2022-12-23
猜你喜欢
  • 2021-11-18
  • 2022-12-23
  • 2021-04-18
  • 2021-08-30
  • 2022-12-23
相关资源
相似解决方案