Java代理模式

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

定义在不修改方法的情况下对方法进行增强添加其他处理逻辑。代理作用是减少代码臃肿符合单一职责即一个方法只做自己的事情。

代理分为静态代理和动态代理。

静态代理是编译期就已经确确定代理关系动态代理是程序运行期动态确定代理关系。

java类加载阶段分为三个步骤
1、将字节码转换为二进制流这个字节码来源可以是硬盘上的字节码网络上的字节码动态计算生成的字节码而静态代理就是从硬盘上加载的字节码动态代理就是动态计算产生的字节码。
2、将字节码表示的静态结构存储到方法区运行时数据结构
3、创建这个类的Class实例作为方法区访问这个类的入口。

静态代理模式相关角色
委托类接口
委托类
代理类
客户类

静态代理类实现步骤

1、定义一个委托类接口和相关方法

2、定义一个委托类接口实现并实现所有接口方法

3、定义一个代理类并实现所有委托类接口方法并定义一个成员变量该成员变量是委托类接口类型。

4、定义代理类的构造方法传入一个委托类接口类型变量并且在代理类所有方法中调用成员变量对应的同名接口方法同时可添加增强逻辑。

5、使用创建一个委托类实现对象和一个代理类对象并将委托类对象引用传入代理类对象的构造方法调用代理类相关方法。

动态代理分为jdk动态代理和cglib动态代理。
jdk动态代理是基于类接口生成代理类对象所以在创建jdk代理对象时必须有一个该接口的实现即委托类对象在回调方法中才能对委托类对象进行增强。cglib是基于类继承生成委托类和代理类所以在回调方法中可以直接调用父类的方法而不需要提前创建委托类对象。

jdk动态代理关键API
Proxy
创建代理类方法Proxy.newInscance(创建代理对象使用的类加载器委托类的接口列表代理类方法被调用时的处理器InvocationHandler接口实现)

cglib动态代理关键API
Enhencer
创建代理类方法
Enhencer enhencer = new Enhencer();
enhencer.setSuperCalss(委托类Class对象);
enhencer.setCallback(代理类方法被调用时的拦截器(MethodInterceptor接口实现));
enhancer.create();

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java