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
- Android中使用动态代理模式
- android 代理模式 动态代理
- Android动态代理模式
- Android开发中常用的设计模式 --- 动态代理模式
- 代理模式在android中使用
- Android中代理模式
- Java中动态代理使用
- 代理模式--动态代理
- 代理模式 & 动态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 机器学习面试2
- poj 1269 Intersecting Lines
- HDU 1003
- Java反射机制详解
- 【经典智力题】1024! 末尾有多少个0?——“计算阶乘末尾0的数量”问题引出
- Android中使用动态代理模式
- Atitit需求文档模板大纲目录 attilax总结
- Spring-MVC框架下对web.xml文件及spring_mvc.xml文件内容的释义资料整理
- python的数学运算符
- vue2.0 中上传文件
- 单例模式-注意线程安全
- 快速排序
- PHP数字金额转中文大写金额
- 为什么要进行烦人的单元测试