Android 插件化分析(2)- 动态代理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值