前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA 动态代理

JAVA 动态代理

作者头像
哲洛不闹
发布2018-09-14 11:15:01
6000
发布2018-09-14 11:15:01
举报
文章被收录于专栏:java一日一条

具体场景

为了使代理类和被代理类对第三方有相同的函数,代理类和被代理类一般实现一个公共的interface,该interface定义如下

被代理类定义如下

代理需求:在add函数和minus函数调用前后分别输出before invocation和after invocation字样

静态代理解决方案

代码如下:简单直接,无需赘言,如果calculator里边不仅有add和minus,还有divide,product,log,sin…呢,呵呵哒

动态代理解决方案

首先编写实现InvocationHandler接口的类,用于请求转发,实现如下

生成动态代理

无论calculator中包含多少函数,动态代理只需实现一次,实际工程中,System.out.println(“in calculatorhandler, before invocation”)可能是加缓存,打日志等操作

动态代理如何工作的

为了搞清楚动态代理如何工作,首先看看生成的动态代理的代码是什么,借助[1]中ProxyUtil代码

得到了生成的动态代理代码如下:

有点长,按照初始化顺序慢慢来分析,首先分析静态代码块:

得到公共interface中的add函数和minus函数对应的Method方法,同事也得到了equals,toString,hashCode三个函数的Method,所以调用代理类的equals,toString,hashCode也是要执行被代理类的方法的,知道这点很有必要

构造函数

初始化了内部的InvocationHandler变量,也就是下文的super.h

以add为例看一下请求的转发

super.h.invoke就是invocationhandler.invoke就是传入的CalculatorHandler中实现的

最终执行的就是CalculatorHandler对应的invoke函数

总结

生成动态代理的过程步骤如下[2]:

Proxy.newProxyInstance帮我们做了2,3,4步,直接返回给我们一个动态代理对象,代理对象最终执行InvocationHandler中invoke函数。顺便强推文章[2],自行复制链接即可打开。

References

  1. https://github.com/android-cn/android-open-project-demo/tree/master/java-dynamic-proxy
  2. https://www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 具体场景
  • 静态代理解决方案
  • 动态代理解决方案
  • 动态代理如何工作的
  • 总结
  • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档