Java中代理模式的深入

54 阅读2分钟

一、概念

1、定义

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。同时代理对象可以调用被代理对象的方法,并对其进行增强。可以总结为代理对象 = 增强代码 + 被代理(原对象)

2、场景

切面模式

二、静态代理

1、步骤

  • 定义接口:被代理类和代理类都需要实现该接口
  • 定义被代理类:实现上面定义的接口
  • 定义代理类:(1)实现上面定义的接口 (2)创建被代理对象(3)调用方法时需要调用被代理对象的方法,同时自己可以对方法进行增加

2、问题

如果一个类需要被代理,就得去创建一个代理类。如果被代理的类过多,这样就需要手动创建很多代理类。为了解决这个问题,便有了动态代理

三、基于Java反射的动态代理

1、反射和类加载机制,Java动态代理是面向接口的代理模式****

2、使用反射实现动态代理

  • 通过getProxyClass获得代理对象的Class对象(接口+对应的构造函数)
  • 通过Class对象调用得到构造方法。 Constructor<?> constructor = proxyClazz.getConstructor(InvocationHandler.class)
  • 构造方法去创建实例,构造方法传入InvocationHandler实例,需要实现其invoke方法
  • 通过代理对象调用方法

  四、基于CGLib的动态代理

  1. CGlib可以传入接口也可以传入普通的类,接口使用实现的方式,普通类使用会使用继承的方式生成代理类
  2.  CGLIB 原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。
  3.  CGLIB 底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
  4. 7.CGLIB缺点:对于final方法,无法进行代理。

cloud.tencent.com/developer/a…