Android中使用动态代理模式

在最近的项目开发中,在封装业务层对外接口时,需要对所有的方法操作,例如捕获自定义的异常消息等,之后想到使用动态代理的方式进行处理,具体的Demo如下:
1、业务接口类和接口具体实现类
IGlobalService.java

public interface IGlobalService {
    void method1();
    void method2();
    void method3();
}

GlobalServiceImpl.java

public class GlobalServiceImpl implements IGlobalService {
    private static final String TAG = GlobalServiceImpl.class.getSimpleName();

    @Override
    public void method1() {
        Log.i(TAG,"method1()");
    }

    @Override
    public void method2() {
        Log.i(TAG,"method2()");
    }

    @Override
    public void method3() {
        Log.i(TAG,"method3()");
    }
}

2、调用处理器类
动态代理的实现,需要实现InvocationHandler,并且传入被代理对象。

public class GlobalServiceDynamicProxy implements InvocationHandler {

    private static final String TAG = GlobalServiceImpl.class.getSimpleName();
    private  Object mProxied;//被代理的对象

    private GlobalServiceDynamicProxy(Object proxied){
        this.mProxied = proxied;
    }

    static IGlobalService createServiceProxy(IGlobalService realImpl){
        //创建调用处理器对象
        GlobalServiceDynamicProxy proxy = new GlobalServiceDynamicProxy(realImpl);
        //获取需要被代理的对象(IGlobalService类型的对象)的一组接口
        Class[] classes = realImpl.getClass().getInterfaces();
        //传入被代理对象类型的ClassLoader、一组接口和调用处理器对象,生成动态对象
        IGlobalService serviceProxy = (IGlobalService) Proxy.newProxyInstance(IGlobalService.class.getClassLoader(),classes,proxy);
        return serviceProxy;
    }



    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Log.i(TAG,"GlobalServiceProxy before invoke");
        method.invoke(mProxied,args);
        Log.i(TAG,"GlobalServiceProxy after invoke");
        return null;
    }
}

3、测试
GlobalServiceManager.java:

    public abstract  class GlobalServiceManager {

    private static IGlobalService sService;

    public static void init(){
        if(sService==null){
            sService = GlobalServiceDynamicProxy.createServiceProxy(new GlobalServiceImpl());
        }
    }

    public static IGlobalService getService(){
        if(sService==null){
            init();
        }
        return sService;
    }
}

ApplicationTest .java

public class ApplicationTest extends ApplicationTestCase<Application> {
    private IGlobalService mService;

    public ApplicationTest() {
        super(Application.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        GlobalServiceManager.init();
        mService = GlobalServiceManager.getService();

    }

    public void testMethod1(){
        mService.method1();
    }
    public void testMethod2(){
        mService.method2();
    }
    public void testMethod3(){
        mService.method3();
    }
    }

4、测试运行结果
GlobalServiceProxy before invoke
GlobalServiceImpl: method1()
GlobalServiceImpl: GlobalServiceProxy after invoke
GlobalServiceImpl: GlobalServiceProxy before invoke
GlobalServiceImpl: method2()
GlobalServiceImpl: GlobalServiceProxy after invoke
GlobalServiceImpl: GlobalServiceProxy before invoke
GlobalServiceImpl: method3()
GlobalServiceImpl: GlobalServiceProxy after invoke

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值