转自这个公众号:

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

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

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

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

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

那还有什么办法呢?

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

我有一个接口:

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

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

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

两个方式:

静态代理

在写一个类:

这时候在调用:

看一下结果:

动态代理

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

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

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

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

来一下效果:

简而言之

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

(转 )【Android那些高逼格的写法】InvocationHandler与代理模式的更多相关文章

  1. 打造一个高逼格的android开源项目——小白全攻略 (转)

    转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...

  2. 几个简单js,普通写法和高逼格写法比较

    1. 取数组中的数据,并对空值设置默认值: 常规写法: let arr = [0, 1, null, '', 'abc']; let newArr = []; arr.forEach((item, i ...

  3. 教你制作高逼格的技术分享Keynote(PPT)

    本文来自 网易云社区 . 作为一个程序猿/媛,想必大家都参与过大大小小各式各样的技术分享,异或在不同的场合分享自己的技术心得.抛开分享内容的质量不谈,笔者发现通常这些分享者的演示文稿(Keynot或P ...

  4. js原生高逼格插件

    如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...

  5. android版高仿淘宝客户端源码V2.3

    android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...

  6. 高逼格的实现WiFi共享,不安装第三方wifi共享软件,两种方式实现开启wifi的功能

    作为一枚程序员,不会点高逼格的doc命令,那么都有点感觉对不起自己的行业了,好了废话就到这里了   第一种方式: 首先使用cmd命令:window键+R 然后输入cmd回车 第一种方式: 第一步: 设 ...

  7. VopSdk一个高逼格微信公众号开发SDK(源码下载)

    看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...

  8. VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)

    VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移 ...

  9. 多服务器终端交互利器--polysh和atnodes到高逼格日志中心

    最近博客更新的少了,相对而言,我在自己的个人公众号里还是挺活跃的,大家可以扫描旁边的二维码,或者微信搜索公众号:“编程一生”加关注. 在分布式的年代,一个应用需要部署到多台服务器上.那么要查看日志文件 ...

随机推荐

  1. Telnet协议详解

    转:http://www.cnblogs.com/dazhaxie/archive/2012/06/27/2566054.html 1. 概述 Telnet协议是TCP/IP协议族中的一员,是Inte ...

  2. Spring-data-jpa 之Specification in的用法

    1.一个简单的 Predicate 的示例 构建简单的Predicate示例: Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+ ...

  3. 配置kubernetes UI图形化界面

    配置Kubernetes网络 在master和nodes上都需要安装flannel yum install flannel 在master和nodes上都需要配置flannel vi /etc/sys ...

  4. convert image to base64

    ylbtech-Unitity-cs:convert image to base64 convert image to base64 1.A,效果图返回顶部   1.B,源代码返回顶部 1.B.1,c ...

  5. centos7 ping127.0.0.1不通

    ping 127.0.0.1,localhost和本地ip都不通,所有的配置也是正确的 检查下是否禁止了ping vim /proc/sys/net/ipv4/icmp_echo_ignore_all ...

  6. Linux(CentOS)修改IP地址

    登陆连接centos系统,输入 ifconfig 可以查看到当前本机的IP地址信息 一 临时修改IP地址: 1.假如查询IP为1.118,输入 ifconfig eth0 (默认是第一个网卡) 后面接 ...

  7. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何修改界面皮肤

    切换到视图管理器,然后可以切换皮肤,会有预览效果     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: ...

  8. 进程资源和进程状态 TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE

    摘要:本文主要介绍进程资源和进程状态.进程资源由两部分组成:内核空间进程资源以及用户空间进程资源.进程状态,就绪/执行状态.等待状态(能够被中断打断).等待状态(不能够被中断打断).停止状态和僵死状态 ...

  9. Unity 提取游戏资源之ktx转换

    http://blog.csdn.net/akof1314/article/details/38022263 从雨松的博文<Unity3D研究院之mac上从.ipa中提取unity3D游戏资源( ...

  10. Appstore 提交时错误

      ERROR ITMS-9000:This boundle is invalid. New apps and app updates submitted to the App Store must  ...