代理类和被增强对象的关系

代理类和被增强对象的关系

代理返回的应该是Proxy类型的引用,怎么说强转就强转了,Proxy  Object  和  UserDao 三个类的关系到底是怎样的?

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

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

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

1回答
提问者 楚楚提 2019-01-20 23:26:17

查了一晚上资料终于懂了,但是最后还有一个问题,麻烦老师看下:

整个动态代理的机制:

首先是 getClass 方法返回的是调用该方法对象的真实类型,也就是最下层的子类,所以

Proxy.newInstance方法的第一个参数其实是代理对象的真实类型.


Proxy.newInstance方法的第二个参数传入的是接口,所以使用jdk动态代理的对象,他的真实类型必须是实现接口的一个类,最终这个动态生成的代理类会声明实现这些接口,之后生成这个代理类的代理对象,因为他实现了上述接口,所以他可以向上转化成其中的一个接口,并且可以调用这些接口里面的方法.本次例子因为返回值为Object类型,所以需要强制类型转化.

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

但是在代理对象proxy调用接口的方法的时候,

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

由于多态,他会调用代理类实现的接口方法,又由于设置了InvocationHandler,会调用这个 InvocationHandler对象所实现的invoke方法,也就是切入点Pointcut被拦截,执行通知Advice,在本次的例子当中,就是在invoke方法对userDao的增删改查进行了调用,当然,最终调用的还是UserDaoImpl实现类中的增删改查方法.


至于为什么调用代理类方法的时候会去调用InvocationHandler对象所实现的invoke方法,我就不知道了.

能解答一下吗?

  • invoke()方法应该是自动调用的,你看下这个博客呢: https://www.cnblogs.com/YL450606975/p/5515670.html
    2019-01-21 10:44:14
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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