您的位置:首页 > 职场人生

大白面试之动态代理模式

2021-02-26 21:48 851 查看

记得是去年大白在求职过程中,一位面试官面试大白的时候问了这么一个问题

面试官:你可以说一下常用的两种动态代理模式是什么吗?

大白:面露尴尬的笑容并且微微的摇了摇头.........

没错,大白当时直接懵逼了,动态代理听说过,但是仅仅停留在了听说的档次.........

举一个生活中的例子,比如大白的好朋友小黑去医院看病(希望小黑同学不是真的生病了),小黑去医院的目的就是看病,但是除了看病这个目标之外,还有许多额外的事情比如去门诊挂号,去交费等等事情使得本就生病的小黑疲惫不堪,这时候小黑想起了在医院工作的朋友(小黑真是一个有本事的同学),小黑的朋友帮助小黑完成了挂号等一系列的杂事,使得小黑可以顺利的就诊(真是一件皆大欢喜的事情)。

通过小黑的例子我们就知道了动态代理的意义就在于通过生成一个代理对象来代理真实对象,从而在真实对象访问之前和之后进行一些对应的逻辑操作、控制真实对象的访问(比如小黑没带钱,没带钱你来看什么病......)


在java中常用的动态代理技术有两种,一种是jdk自带的代理功能,另一种是有第三方提供的CGLIB技术。


一、JDK动态代理:

JDK动态代理是java.lang.reflect包提供,它必须提供一个接口才能产生代理对象,所以大白先定义一个简单的接口,再定义一个实现类


定义好接口和实现类以后,就可以开始动态代理了,代码如下图所示

上图代码中

第一步是建立起代理对象和真实对象之间的关系,图中是由bind方法去完成的,通过target保存了真实对象,然后通过

return Proxy.newProxyInstance(target.getClass().getClassLoader(),

target.getClass().getInterfaces(), this);建立对象关系并且生成代理对象

其中newProxyInstance包含了3个参数

第一个是类加载器,我们采用的是target本身的类加载器

第二个参数是把生成的代理对象下挂到真实对象所属的接口下

第三个参数是表示使用当前对象作为代理类


第二步是实现逻辑方法

method.invoke(target, args)是调用真实对象的方法,我们可以看到在进行真实对象方法调用之前和之后可以加入实际所需的逻辑


我们现在通过一个测试类进行测试,如下图代码


二、CGLB动态代理

JDK动态代理必须通过接口才能使用,而CGLIB不需要提供接口就可以实现动态代理,代码如下图所示:

在测试之前大白重新定义了一个没有实现任何接口的普通类

定义好普通类之后进行测试,代码如下图所示


总结:JDK的动态代理其实和CGLIB的动态代理很相似,只是CGLIB动态代理不需要真实对象实现接口,比较灵活。

动态代理是很重要的技术,我们平时使用的很多框架技术都使用到动态代理技术,所以掌握好动态代理技术可以帮助我们能更好的理解框架技术的底层原理。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: