静态代理与动态代理

616 阅读4分钟

往期回顾

PBE加密算法

MD系列算法

SHA系列算法

ARM汇编语言程序结构

代理模式分为静态代理和动态代理 ,静态代理是编译阶段就生成代理类来完成对代理对象的一系列操作。动态代理是指在运行时动态生成代理类。即代理类的字节码将在运行时生成并载入当前代理的 ClassLoader。

静态代理就是在程序运行前就已经确定代理类与代理对象的代理模式,它通常用于对原有业务逻辑的扩充。比如某个接口类,并调用其中的某些方法,出于对记录日志、打印方法执行时间等的某种原因,又无法将这些逻辑写入接口类的方法里。因此需要创建一个代理类实现和二方方法相同的方法,通过让代理类持有真实对象的方式,在原代码中调用代理类方法,以达到添加需要业务逻辑的目的。

一:如何实现静态代理

1.首先创建代理类,在代理类里面实现接口,再创建声明类,然后实例化得到对象。

(1)声明一个接口类,如下图所示。

(2)定义一个租房子的方法,如下图所示。

2.具体实现需要再定义一个类,这个类实现接口类里面的方法,此时就需要通过代理来完善或者达到需求,修改这个方法或者扩展这个方法,但是又不能变动原有的方法,步骤如下:

(1)创建代理类并且实现接口,如下图所示。

(2)声明一个对象后进行实例得到对象,如下图所示。

(3)在代理类里面定义两个方法分别是代理之前和代理之后,如下图所示。

(4)调用里面的方法,做出相应的修改,比如参数、返回值等,这也就是代理的作用。 在MainActivity里面实例化代理的类,此时为proxy类,如下图所示。

然后运行打印一下log日志信息,效果如图1.7所示。代理的作用一目了然,清晰可见它的变化。

动态代理的目的就是为了解决静态代理的缺点,通过使用动态代理,在运行时动态生成一个持有RealObject,并实现代理接口的Proxy,同时注入相同的扩展逻辑。即使你要代理的RealObject是不同的对象,代理不同的方法,都可以通过动态代理来扩展功能。

动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中进行处理(InvocationHandlerinvoke)。在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一复用性更强。

二:动态代理的核心

动态代理的核心就是代理对象的生成,其核心代码需要三个参数。

  • ClassLoader:用于加载代理类的Loader类,通常这个Loader和被代理的类是同一个Loader类。

  • Interfaces:是要被代理的接口。

  • InvocationHandler:是用于执行除了被代理接口中方法之外用户自定义的操作,也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler类中定义的唯一方法invoke中。

三:如何实现动态代理

1.首先定义一个接口,如下图所示。

2.实现这个接口类,如下图所示。

3.代理需要实现类,代理实现的接口为InvocationHandler(为系统提供类),查看该系统提供的接口,发现只有一个方法,并且该方法有三个参数。实现Invoke方法中,传入相应的参数,定义要代理的对象并且初始化,设置完成后便调用,如下图所示。

4.准备代理器,在MainActivity类里面实例化目标对象,然后调用方法用来设置代理的类。把代理传给系统的handler,生成新的代理对象,调用target得到类和接口、代理类、新的代理对象调用方法(指定接口),进而调用方法,如下图所示。

5.运行查看效果。

小结

学习动态代理的概念以及如何使用动态代理,实战操作动态代理的使用以及代码的编写。

静态代理的概念,以及如何使用静态代理。实战操作静态代理的使用以及代码的编写。

如果你也对安卓逆向感兴趣,请添加联系方式,微信搜索【宸道移动安全团队】,关注有惊喜哦!

企鹅群:876526335

vx:Yjxiaox