动态代理类的底层实现原理是什么?

动态代理类的底层实现原理是什么?

老师,为什么为一个业务类配置了动态代理类后,调用业务类的方法时,就会自动调用代理类的invoke方法?jdk底层是如何实现的,能否依据jdk源码讲讲实现原理?这样理解的会更深刻

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
Lair 2019-06-28 15:13:05

你看动态代理是不是有这么几个数据:target、method、args,实际上你可以把这几个看做是将要执行的句柄, JVM 持有这些句柄,把这些交给代理对象去执行,这就是为什么jdk代理需要手动调用 method.invoke 的原因,因为这时候 jdk 代理只能通过这样执行了,带来的方便就是你可以在前后添加自己的切面逻辑,并决定是否执行业务方法。cglib自己去捋吧,实现方式跟 jdk 有区别

芝芝兰兰 2019-06-27 15:35:26

同学你好。源码阅读不是一句两句可以解释清楚的,可能需要同学好好研究一下。慕课网的手记中就有大量的相关文章 ,老师在这里为你推荐两篇:

1、https://www.imooc.com/article/272897?tdsourcetag=s_pctim_aiomsg  这个从代码角度切入,先实现了一个简易版的动态代理,然后分析了jdk8的源码

2、https://www.imooc.com/article/21339?tdsourcetag=s_pctim_aiomsg 这一篇则是给了一个具体情境,讲了代理模式,包括java动态代理和CGLib的原理

祝学习愉快~

芝芝兰兰 2019-06-27 14:57:41

同学你好。老师在视频中其实已经把原理说的挺清楚了,Proxy.newProxyInstance
底层只是利用了反射,根据类加载器和this创建了一个动态代理对象。使其使用代理对象proxy调用每个方法之前,比如视频中的增删改查方法,都会先到我们写的invoke方法中去,执行到Method.invoke方法时,其实就相当于直接执行我们在UserDaoImpl中定义的原方法。

http://img1.sycdn.imooc.com//climg/5d14629600019a8610910566.jpg

通俗来讲,可以这样理解,动态代理对象就是程序在运行时临时组装的对象,它的方法比原对象的方法多了一层包裹,我们自己实现的invoke方法制定了包裹的外层是什么逻辑。

如果解答了同学的疑问,望采纳~

祝学习愉快~


  • 提问者 qq_永不言败_0 #1
    我问的是更底层怎么实现的,不是指概念性的
    2019-06-27 15:10:23
  • 慕仔3163040 回复 提问者 qq_永不言败_0 #2
    同学你好,更底层的话,你是指反射是如何实现的吗?这样再往底层的话就涉及到类加载器那一块儿了吧。
    2019-09-14 23:58:03
  • 老师你好,我看你说执行到Method.invoke方法时,其实就相当于直接执行我们在UserDaoImpl中定义的原方法,那如果UserDaoImpl中的方法返回值是void的,我们写return method.invoke(userDao, args)时相当于返回了一个void啊,这不是有问题了吗?
    2019-09-15 00:00:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师