关于java中的动态代理

首先引入两篇引子Android业务组件化之URL Scheme使用Android业务组件化之现状分析与探讨。这两篇文章主要是介绍android中进行业务组件化处理的定义和实现方式,其中进行业务模块解耦后页面跳转方式中有一部分关于动态代理的内容,这才勾起了我对动态代理的兴趣。
关于动态代理的好处,我引用知乎上一个类似问题的回答:
“主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情(甚至根本不去执行这个方法),因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象,具体应用的话,比如可以添加调用日志,做事务控制等。

还有一个有趣的作用是可以用作远程调用,比如现在有Java接口,这个接口的实现部署在其它服务器上,在编写客户端代码的时候,没办法直接调用接口方法,因为接口是不能直接生成对象的,这个时候就可以考虑代理模式(动态代理)了,通过Proxy.newProxyInstance代理一个该接口对应的InvocationHandler对象,然后在InvocationHandler的invoke方法内封装通讯细节就可以了。具体的应用,最经典的当然是Java标准库的RMI,其它比如hessian,各种webservice框架中的远程调用,大致都是这么实现的。

作者:KevinShn
链接:https://www.zhihu.com/question/20794107/answer/23334315
来源:知乎
著作权归作者所有,转载请联系作者获得授权。”
动态代理的好处最主要的我感觉就是“主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情”。这个是非常有魅力的事情!而恰好我使用的一个第三方库BluetoothKit(dingjikerbo)【github上可以搜到】的源码中也有用到动态代理的,贴一下代码:

public class ProxyInvocationHandler implements InvocationHandler, ProxyInterceptor, Callback {

    private Object subject;

    private ProxyInterceptor interceptor;

    private boolean weakRef;

    private boolean postUI;

    private Handler handler;

    public ProxyInvocationHandler(Object subject) {
        this(subject, null);
    }

    public ProxyInvocationHandler(Object subject, ProxyInterceptor interceptor) {
        this(subject, interceptor, false);
    }

    public ProxyInvocationHandler(Object subject, ProxyInterceptor interceptor, boolean weakRef) {
        this(subject, interceptor, weakRef, false);
    }

    public ProxyInvocationHandler(Object subject, ProxyInterceptor interceptor, boolean weakRef, boolean postUI) {
        this.weakRef = weakRef;
        this.interceptor = interceptor;
        this.postUI = postUI;
        this.subject = getObject(subject);
        handler = new Handler(Looper.getMainLooper(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object subject = getObject();

        if (!onIntercept(subject, method, args)) {
            ProxyBulk bulk = new ProxyBulk(subject, method, args);
            return postUI ? postSafeInvoke(bulk) : safeInvoke(bulk);
        }

        return null;
    }

    @Override
    public boolean onIntercept(Object object, Method method, Object[] args) {
        if (interceptor != null) {
            try {
                return interceptor.onIntercept(object, method, args);
            } catch (Exception e) {
                BluetoothLog.e(e);
            }
        }
        return false;
    }

    private Object getObject(Object object) {
        return weakRef ? new WeakReference<Object>(object) : object;
    }

    @SuppressWarnings("unchecked")
    private Object getObject() {
        if (weakRef) {
            return ((WeakReference<Object>) subject).get();
        } else {
            return subject;
        }
    }

    private Object postSafeInvoke(ProxyBulk bulk) {
        handler.obtainMessage(0, bulk).sendToTarget();
        return null;
    }

    private Object safeInvoke(ProxyBulk bulk) {
        try {
            return bulk.safeInvoke();
        } catch (Throwable e) {
        }
        return null;
    }

    @Override
    public boolean handleMessage(Message msg) {
        // TODO Auto-generated method stub
        ProxyBulk.safeInvoke(msg.obj);
        return true;
    }
}

他里面主要增添的功能就是方法调用的线程分配,将一些任务放到主线程做,这与android中一般用的线程调度方式相比比较新颖,也比较奇特。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值