Android中使用动态代理模式

来源:互联网 发布:数控编程培训靠谱吗 编辑:程序博客网 时间:2024/06/17 04:03

在最近的项目开发中,在封装业务层对外接口时,需要对所有的方法操作,例如捕获自定义的异常消息等,之后想到使用动态代理的方式进行处理,具体的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 0
原创粉丝点击