zoukankan      html  css  js  c++  java
  • (转 )【Android那些高逼格的写法】InvocationHandler与代理模式

    转自这个公众号:

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

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

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

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

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

    那还有什么办法呢?

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

    我有一个接口:

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

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

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

    两个方式:

    静态代理

    在写一个类:

    这时候在调用:

    看一下结果:

    动态代理

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

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

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

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

     

    来一下效果:

     

    简而言之

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

  • 相关阅读:
    记录PHP的执行时间
    Mysql数据字典导出
    PHP用post来进行Soap请求
    laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题
    使用vagrant构建你们团队的开发环境
    Lumen框架使用Redis与框架Cache压测比较
    使用php-cs-fixer格式化你的代码
    Javascript下拉导航
    jsf2.0视频
    jsf2入门视频 教程
  • 原文地址:https://www.cnblogs.com/woaixingxing/p/9055318.html
Copyright © 2011-2022 走看看