代理模式是一个非常常用的设计模式,如果一个类的名称带有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有三个参数

  1. ClassLoader : 代理对象对应的ClassLoader
  2. Class : 代理对象所实现的接口 (动态代理只能针对接口实现)、
  3. InvocationHandler: 需要实现这个接口,里面包含我们真正的代理逻辑。

通常我们不会代理所有的方法,所以一般需要提前把对象对象注入到InvocationHandler的实现类里。Demo里因为采用了匿名内部类的方式所以无须传入代理对象。

Proxy类的newProxyInstance 方法可以对任何一个接口类型的对象进行代理,为对象增加功能或者改变方法的行为。在插件化技术中,我们可以直接替换到原来的对象,这就是Hook。

更多相关文章

  1. Android(安卓)Camera Framework层分析
  2. Android(安卓)中判断是否存在虚拟按键
  3. WebView深究之Android是如何实现webview初始化的
  4. Android(安卓)webview加载富文本 屏幕简单适配
  5. Android(安卓)UI开发第七篇之Android(安卓)Gallery
  6. android中setVisibility的用法
  7. Android(安卓)混淆配置文件及常用第三方混淆
  8. 下载 android 源码错误curl: (6) couldn't connect to host的解
  9. Android消息机制2-Handler(Native层)

随机推荐

  1. 苹果悄悄进入企业级市场,iOS起飞,Android折
  2. repo 和 git 管理源代码
  3. Android带进度条的下载图片示例(AsyncTask
  4. android不将apk包编译到系统里的方法
  5. java for android sqlite数据的操作:说实
  6. Android面试题(基础部分1)
  7. Android(安卓)第四天(晚上)
  8. 创建Gridview视图
  9. Android的merge标签用法
  10. android:activity生命周期及几个主要函数