一. 概念
将类和对象按某种布局组成更大的结构。
- 类结构型型:通过继承机制组织接口和类
- 对象结构型:通过组合和聚合来组合
二. 分类
三. 代理模式
- 静态代理:在编译期生成
- 动态代理:在运行时动态生成。JDK代理和CGLib代理。
四. 组成结构
五. 静态代理
代理模式是在不修改目标对象(被代理对象)的基础上,通过代理对象(扩展代理类),进行一些功能的附加与增强——>静态代理是在不改变源代码的基础上增加新的功能。
五. JDK动态代理
动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的.java源文件——>jdk运行期间动态创建class字节码并加载JVM——>代理对象在程序运行的过程中动态在内存构建,可以灵活的进行业务功能的切换。
通过定义代理工厂,利用Proxy的newProxy方法,实现代理对象的创建。可以有效的避免静态代理每个目标类都需要创建一个代理类的缺陷。
六. GcLib代理
由于代理对象,在使用Proxy类的newProxyInstance创建代理对象时,你需要指定一个接口列表来表示代理对象所应该实现的接口。
而GCLib能支持类的动态代理。
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
cglib生成的代理对象是目标对象类的子类。 它通过ASM转换字节码生成代理类。它不能代理final修饰的类\方法(final修饰的类不能有子类,final修饰的方法不能重新)
注:需要使用JDK8及以下版本(在Java 9之前,Java的所有内部类都可以被访问。然而,在Java 9中,Oracle引入了一个新的特性,称为Java平台模块系统 (JPMS),以便更好地封装Java的内部类。当试图通过反射访问这些内部类时,就会出现Unable to make protected final 错误。尝试将版本或添加以下VM参数:
–add-opens java.base/java.lang=ALL-UNNAMED)