首页 > 移动平台 > 详细

(转 )【Android那些高逼格的写法】InvocationHandler与代理模式

时间:2018-05-18 12:47:22      阅读:1805      评论:0      收藏:0      [点我收藏+]

转自这个公众号:

技术分享图片

 

今天会聊一下InvocationHandler。说到InvocationHandler不得不提到的就是代理模式,什么是代理模式,举个例子,你玩游戏,花钱请个代练,代练其实是登录你的账号,假装是你帮你升级打怪。再比如买房,你需要委托中介帮你去处理一些事,中介在办理这些事的时候,实际是使用你的身份证,身份信息去办理的。

代理模式也是一样,比如有一个类,有一个方法是压缩图片的。现在你突然需要,在这个方法之前去做一些操作,比如就是打个log吧,压缩之后再打个log。

可能你会想,那直接改这个方法不就完事了,是的,可以,但是也许要在某些地方调用这个类的方法时候,不需要打印Log。

你又说了,那就再写一个类。当然,也可以,但是你想想,压缩图片的代码是一样的,那你以后岂不是要维护两套一样的代码,不行不行,太费劲了。

这时你可能还不死心,那用继承吧,继承原有类,重写这个压缩方法,super前打印一个log,super后打印一个log。嗯嗯,这个是可行的,但是可能这个类中其它的方法我都用不到,我只用这个压缩方法,继承岂不是太重了。

那还有什么办法呢?

这时候就可以用到代理模式。来,一起看一个例子吧。

我有一个接口:

技术分享图片

没毛病吧,还有个实现类:

技术分享图片

也没毛病吧,直接实例化了就能用。

如果我想在之前之后加点东西怎么办?

两个方式:

静态代理

在写一个类:

技术分享图片

这时候在调用:

技术分享图片

看一下结果:

技术分享图片

动态代理

另外一种就是动态代理了,可以直接使用JDK的动态代理模式(hook中用的比较多,之后的文章会说到)。

动态代理,需要用到反射的概念,关于反射,可以参考我之前的文章(我会附在最下面)。

首先我们不需要去实现这个接口了。只需要去实现Java中的一个接口InvocationHandler

技术分享图片

 

然后利用Proxy类进行实例化:

 技术分享图片

来一下效果:

技术分享图片

 

简而言之

Proxy是一个方法拦截器,第一个参数是ClassLoader,第二个参数是拦截的类,InvocationHandler就是拦截的接口,在InvocationHandler中可以重新实现这个方法。

(转 )【Android那些高逼格的写法】InvocationHandler与代理模式

原文:https://www.cnblogs.com/woaixingxing/p/9055318.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!