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库动态修改子类的代码来实现的,所以可以用传入的类引用执行代理类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值