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