目录
前言:
Android 插件化是一种将应用程序分解为多个独立的组件的技术,这些组件可以单独开发、测试和部署。其中,Hook 机制是 Android 插件化中的一种关键技术,它可以帮助开发人员在运行时动态地修改应用程序的行为。动态代理是 Hook 机制中的一种常用技术,它可以帮助开发人员创建一个代理对象,以便在调用原始对象的方法时执行额外的操作。
代理是什么
为什么需要代理呢?其实这个代理与日常生活中的“代理”,“中介”差不多;比如你想海淘买东西,总不可能亲自飞到国外去购物吧,这时候我们使用第三方海淘服务比如惠惠购物助手等;同样拿购物为例,有时候第三方购物会有折扣比如当初的米折网,这时候我们可以少花点钱;当然有时候这个“代理”比较坑,坑我们的钱,坑我们的货。
从这个例子可以看出来,代理可以实现方法增强,比如常用的日志,缓存等;也可以实现方法拦截,通过代理方法修改原方法的参数和返回值,从而实现某种不可告人的目的~接下来我们用代码解释一下。
静态代理
静态代理,是最原始的代理方式;假设我们有一个购物的接口,如下:
1 2 3 |
public interface Shopping { Object[] doShopping(long money); } |
它有一个原始的实现,我们可以理解为亲自,直接去商店购物:
1 2 3 4 5 6 7 8 |
public class ShoppingImpl implements Shopping { @Override public Object[] doShopping(long money) { System.out.println("逛淘宝 ,逛商场,买买买!!"); System.out.println(String.format("花了%s块钱", money)); return new Object[] { "鞋子", "衣服", "零食" }; } } |
好了,现在我们自己没时间但是需要买东西,于是我们就找了个代理帮我们买:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class ProxyShopping implements Shopping { Shopping base; ProxyShopping(Shopping base) { this.base = base; } @Override public Object[] doShopping(long money) { // 先黑点钱(修改输入参数) long readCost = (long) (money * 0.5); System.out.println(String.format("花了%s块钱", readCost)); // 帮忙买东西 Object[] things = base.doShopping(readCost); // 偷梁换柱(修改返回值) if (things != null && things.length > 1) { things[0] = "被掉包的东西!!"; } return things; } |
很不幸,我们找的这个代理有点坑,坑了我们的钱还坑了我们的货;先忍忍。
动态代理
传统的静态代理模式需要为每一个需要代理的类写一个代理类,如果需要代理的类