JAVA语言之关于JDK动态代理的实现讲解
小标 2018-09-11 来源 : 阅读 1465 评论 0

摘要:本文主要向大家介绍了JAVA语言之关于JDK动态代理的实现讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之关于JDK动态代理的实现讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

众所周知,Spring的AOP是基于动态代理实现的,下面是对其中的一种,JDK动态代理实现的一些理解
一、当我们要代理一个对象时,如TargetImpl对象,操作如下
InvocationHandler handler=new BusinessHandler(new TargetImpl());
Target proxy=(Target)Proxy.newProxyInstance(TargetImpl.class.getClassLoader(), new Class[]{Target.class}, handler);
上面的proxy继承了目标接口,所以跟Target接口一样可以调用相同的方法,达到代理的目的
二、其中的InvocationHandler(调用处理器)需要自己定义,毕竟是为了代理目标类的方法,所以这些多出来的逻辑操作应该在它里面的invoke方法中定义,如
public class BusinessHandler implements InvocationHandler { private Object object;  public BusinessHandler(Object object) {  this.object=object; }  @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  if (method.getName().equals("output1")) { System.out.println("before calling output1");method.invoke(object, args);//调用这个对象的方法System.out.println("after calling output1");  } else if (method.getName().equals("output2")) {System.out.println("before calling output2");method.invoke(object, args);System.out.println("after calling output2");  }  return null;//这里return的是proxy.output1()/output2()  }}
为什么要在这个handler里面定义一个目标对象?因为在invoke方法中需要利用反射调用到该对象方法,这样也就知道了为什么在handler实例化时要使用以目标对象为入参的构造方法,对invoke方法的入参
Object proxy, Method method, Object[] args 的理解可以参考到ProxyGenerator所生成的代理类
三、生成的代理类$Proxy0,大致结构如下
public class $Proxy extends Proxy implements Target{ Method m0,m1,m2,m3 ,m4; public void output1( ){ this.h.invoke(this,m3,(Object[ ])null); }public void output2( ){ this.h.invoke(this,m4,(Object[ ])null); }}
从中可以发现,生成的代理类中包含一个个Method对象,这正是目标对象的方法,当我们调用该代理类的目标对象方法,如
proxy.output1( )时,实际上会调用到第二点中自己编写的handler的invoke方法,该方法涵盖了所有目标对象方法格式,
@Override public Object invoke(Object proxy, Method method, Object[] args)
如返回值Object,当被代理的方法返回值为void时,在代理类中的方法则为直接调用,如上红字,否则为return this.h.invoke...    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved