Android(安卓)插件化分析(2)- 动态代理
16lz
2021-01-24
代理模式是一个非常常用的设计模式,如果一个类的名称带有Proxy,基本就是使用了代理模式。
代理模式为其代理的对象提供了访问的控制。
UML图如下
public interface IObject { void run();}class ObjectImpl implements IObject { @Override public void run() { System.out.println("run"); }}class ObjectProxy implements IObject { private IObject mObject; public ObjectProxy(IObject object) { mObject = object; } @Override public void run() { mObject.run(); }}
但是如果按照UML图里每一个楼都要有一个对应的Proxy类,这样Proxy类的数量会非常多。所以在Java中就有了另外一种代理模式-动态代理,也就是Proxy类的newProxyInstance 方法
final IObject obj = new ObjectImpl(); IObject objProxy = (IObject) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke run"); return method.invoke(obj,args); } }); objProxy.run();
newProxyInstance有三个参数
- ClassLoader : 代理对象对应的ClassLoader
- Class : 代理对象所实现的接口 (动态代理只能针对接口实现)、
- InvocationHandler: 需要实现这个接口,里面包含我们真正的代理逻辑。
通常我们不会代理所有的方法,所以一般需要提前把对象对象注入到InvocationHandler的实现类里。Demo里因为采用了匿名内部类的方式所以无须传入代理对象。
Proxy类的newProxyInstance 方法可以对任何一个接口类型的对象进行代理,为对象增加功能或者改变方法的行为。在插件化技术中,我们可以直接替换到原来的对象,这就是Hook。
更多相关文章
- Android(安卓)Camera Framework层分析
- Android(安卓)中判断是否存在虚拟按键
- WebView深究之Android是如何实现webview初始化的
- Android(安卓)webview加载富文本 屏幕简单适配
- Android(安卓)UI开发第七篇之Android(安卓)Gallery
- android中setVisibility的用法
- Android(安卓)混淆配置文件及常用第三方混淆
- 下载 android 源码错误curl: (6) couldn't connect to host的解
- Android消息机制2-Handler(Native层)