小标
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
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号