java代理模式,
分享于 点击 35436 次 点评:237
java代理模式,
阅读:https://juejin.im/post/5aa7818af265da23844040c6
代理模式详解:https://www.cnblogs.com/gonjan-blog/p/6685611.html
动态代理:https://www.imooc.com/article/details/id/21339
代理模式
主要是提供一种间接性
- 静态代理:程序运行之前就已经编译完成
例如:学生(RealSubject)通过班长(proxy)向老师交学费,班长就是一个代理类
学生和班长实现同一个公共接口(包含交学费抽象方法),班长在代理学生交学费之前可以进行其他操作,如判断学生家庭情况等(代理的优势) - 动态代理:代理类在程序运行时创建的代理方式,静态代理只针对某一接口进行操作,如果要对所有接口做一样的操作,就需要动态代理。
蛋糕面包撒杏仁例子,讲的特别通俗清楚:https://www.imooc.com/article/details/id/21339
静态代理:
动态代理:
对比代码,动态代理的思想就很明确了,把具体的被代理类抽象成一个更大范围的类Object,调用具体的方法变成InvocationHandler中的invoke,所以我们只要在invoke方法中统一处理,就可以对所有被代理的方法进行相同的操作了。
创建实例:
1、创建代理对象:
ApricotHandler apricotHandler = new ApricotHandler(fruitCakeMachine);
2、通过proxy创建接口实例
CakeMachine cakeMachine = (CakeMachine)Proxy.newProxyInstance(fruitCakeMachine.getClass().getClassLoader(),fruitCakeMachine.getClass().getInterfaces(),apricotHandler);
Java 动态代理适合于那些有接口抽象的类代理,而 CGLib 则适合那些没有接口抽象的类代理。具体原理可看上方链接。
JDK代理模式为什么只能代理接口?
JDK动态代理的原理是根据定义好的规则,用传入的接口创建一个新类,这就是为什么采用动态代理时为什么只能用接口引用指向代理,而不能用传入的类引用执行动态类。
public class $Proxy1 extends Proxy implements 传入的接口{}
cglib采用的是用创建一个继承实现类的子类,用asm库动态修改子类的代码来实现的,所以可以用传入的类引用执行代理类
相关文章
- 暂无相关文章
用户点评