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

转自这个公众号:

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

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

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

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

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

那还有什么办法呢?

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

我有一个接口:

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

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

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

两个方式:

静态代理

在写一个类:

这时候在调用:

看一下结果:

动态代理

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

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

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

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

来一下效果:

简而言之

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

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

时间: 2024-10-24 10:51:41

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

Android知识体系梳理笔记三:动态代理模式---插件加载机制学习笔记

静态代理模式 静态代理模式就是我们常说的代理设计模式,我们采用一个代理类调用原有的方法,且对产生的结果进行控制:举个例子:我们现在在玩一款网络游戏,需要打怪升级:太累就找个代理吧,一觉醒来就会发现我们已经当上CEO,迎娶白富美,天下第一了! 本来我们只能打怪,打怪-,但经过代理类增强,我们不仅可以打怪,还可以升级拿装备.就这样子了! 上代码: * 同一功能接口 public interface PlayNetGame { String beatMonster(); } 1 2 3 4 1 2 3

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

【转】这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已

[转]这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已 Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);定义一个变量rate是1到5的值,然后执行上面代码,看图 才发现插件什么的都弱爆了 2.如何装逼用代码骂别人SB (!(~+[])+{})[--[~+&qu

高逼格,超简单,实现App自动更新,一个方法搞定

前言 前段时间写了一个篇APP自动更新下载的文章自动更新,一个方法搞定,使用系统的DownloadManager 方法超简洁的实现了apk的下载,不过有好多网友反映有一些机型上面这个方法无法实现下载,经过小编的实验在部分机型上确实会有这个问题,所以其中下载的部分只能通过其它方法搞定了.正好看到网上好多关于使用Retrofit实现下载并且监听进度的文章,并且我一直在看Retrofit的东西但是一直没有机会用到,所以我正好拿这个练练手,最终我使用Retrofit + OkHttp + RxBus +

如何定义一个高逼格的原生JS插件

转自:https://www.jianshu.com/p/205a4033010a 如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高呢?当然是利用js纯原生的写法啦.以前一直说,掌握了js原生,就基本上可以解决前端的所有脚本交互工作了,这话大体上是有些浮夸了.不过,也从侧面说明了原生js在前端中占着多么重要的一面.好了.废话不多说.咱们就来看一下

android数据库的升级的写法

在基类的table中加入upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abst

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

VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移除PayExcute,统一执行入口,目前只保留一个入口Excute b.序列化特性统一,目前只用设置xml特性即可(反序列化时xml和json都可以直接用) c.支持文件上传,目前只有多客服管理上传头像接口用到过 d.使用T4模板自动生产所有Request.Response.以及所有测试Test(装

高逼格电子工程师:给全裸花生棒带套套

极客的世界你永远都不懂,约妹子只是生活调剂,倒腾才是他们的主旋律.你万万没想到,他们眼中的另类时尚是这样的. 近日在花生壳官网(hsk.oray.com)BBS上,一篇网友DIY为全裸花生棒带套套的帖子,引发网友热议.究竟是怎么一回事,跟小编一起一探究竟吧! 先来科普一下,全裸花生棒是花生壳在去年推出的一款专供电子发烧友玩耍的低价硬件,只提供花生棒的内核芯片.主要功能和花生壳软件一样,但不再需要配置专门主机24小时运行花生壳软件,且能够内网穿透.不仅能够实现外网访问内网ERP/OA.FTP下载等

android中ViewHolder通用简洁写法

public class ViewHolder {     // I added a generic return type to reduce the casting noise in client code     @SuppressWarnings("unchecked")     public static <T extends View> T get(View view, int id) {         SparseArray<View> view