欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java代理模式,

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

相关文章

    暂无相关文章
相关栏目:

用户点评