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

摘要:
从这个公众号:我今天将谈论InvocationHandler。说到InvocationHandler,我们不得不提到代理模式。代理模式是什么?例如,你玩游戏并为经纪人付费。代理实际上正在登录到您的帐户并假装帮助您升级。您只需要在Java中实现一个接口InvocationHandler,然后使用Proxy类实例化它:让我们产生一个效果:简而言之,Proxy是一个方法拦截器,第一个参数是ClassLoader,第二个参数是截获的类,InvocationHandler是截获的接口。此方法可以在InvocationHandler中重新实现。

转自这个公众号:

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

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

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

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

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

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

那还有什么办法呢?

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

我有一个接口:

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

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

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

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

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

两个方式:

静态代理

在写一个类:

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

这时候在调用:

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

看一下结果:

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

动态代理

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

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

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

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

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

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

来一下效果:

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

 

简而言之

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

免责声明:文章转载自《(转 )【Android那些高逼格的写法】InvocationHandler与代理模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PAT 乙级 1020 月饼 (25) C++版使用docker搭建公司redmine服务器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux 之 rsyslog

Linux 之 rsyslog 系统日志转发一、rsyslog 介绍     ryslog 是一个快速处理系统日志的程序,提供了高性能、安全功能和模块化设计。rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地,据官网介绍,现在可以处理100万条信息。     特性:1.多线程        2.支持加密协议:ssl,tls,re...

Apache 分割日志

为什么要分割日志 随着网站的 访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日志)整个删除,这样也 丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大 的。 本文将总结一些实用的日志分割方...

<Android基础>(一)

第一章Android 2003年10月,Andy Rubin等人创办了Android公司。2005年8月谷歌收购。 1.1 Android全貌 1.1.1 Android系统架构 1.Linux内核层:为Android设备的各种硬件提供底层驱动。如:显示驱动,音频驱动,蓝牙驱动,WiFi驱动,电源管理。 2.系统运行库层:c/c++库为Android层提供...

解决Windows Git Bash中文乱码问题

在git 安装目录 etc 下面 添加以下配置信息   1,/etc/gitconfig:   [gui]   encoding = utf-8 #代码库统一用urf-8,在git gui中可以正常显示中文   [i18n]   commitencoding = GB2312 #log编码,window下默认gb2312,声明后发到服务器才不会乱码   [...

记录IDEA回退,远程库未回退问题

在使用IDEA的reset时,会出现本地代码虽然回退了,但是远程代码库并未回退到对应的版本。简单说,本地回退了,远程库未回退。这时候我们就需要使用命令行操作方式了。 1、在log上找到要恢复的版本号 使用git log查看需要恢复到的版本号。拿到git log version版本号。 git log git log 2、在客户端执行如下命令(执行...

Java编程基础:配置log4j2.xml同时输出日志到文件和控制台

转: Java编程基础:配置log4j2.xml同时输出日志到文件和控制台开发Java服务程序记日志是很关键的。一旦服务发布部署在云上,出了问题没有日志根本没法定位。现在比较流行是用Spring Boot搭建微服务框架,搭配log4j2输出日志。输出到标准输出的日志可以通过kabana收集和查看,同时程序员也希望能有文件记录完整的日志信息。下面给一份log...