每次使用动态代理都会先查一下怎么用,这次想通过一个demo加深一下印象,所以有了这篇文章。
在梳理过程中,我的总结如下:
· 被动态代理的对象必须实现接口
· 动态代理能调用的方法都是被代理对象的实现接口方法
各位看官觉得有问题可以在评论区留言
创建接口类
这里我们创建了如下两个接口类
public interface IBeProxyMod1 {
void showLog1();
void showLog2(int code);
}
public interface IBeProxyMod2 {
void showLog3(String str);
}
创建接口类的实现类
实现类实现了上面创建的两个接口
public class BeProxyModImpl implements IBeProxyMod1, IBeProxyMod2 {
@Override
public void showLog1() {
Log.e("Tag", "showLog1: ===============" );
}
@Override
public void showLog2(int code) {
Log.e("Tag", "showLog2: ==============code="+code );
}
@Override
public void showLog3(String str) {
Log.e("Tag", "showLog3: ==============str="+str );
}
}
动态代理实现类
private BeProxyModImpl iBeProxyMod;
private Object proxyIBeProxyMod;
//被动态代理的对象必须实现接口
iBeProxyMod = new BeProxyModImpl();
//动态代理能调用的方法都是被代理对象的实现接口方法
proxyIBeProxyMod = Proxy.newProxyInstance(iBeProxyMod.getClass().getClassLoader(), iBeProxyMod.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.e("TAG", "invoke: ========================" );
if (iBeProxyMod == null) {
return null;
}
return method.invoke(iBeProxyMod, args);
}
});
这里说一下Proxy.newProxyInstance的三个参数
· 参数一,被代理类的加载器
· 参数二,被代理类的接口
· 参数三,InvocationHandler的实现
动态代理方法的调用
((IBeProxyMod1)proxyIBeProxyMod).showLog1();
((IBeProxyMod1)proxyIBeProxyMod).showLog2(666);
((IBeProxyMod2)proxyIBeProxyMod).showLog3("showLog3");
强转后调用各个接口的方法
动态代理的使用场景
· 配合反射使用
· 通过动态代理进行统一逻辑处理(如MVP架构中对View可达性判断等)