1. 首先创建代理接口,一个,多个都没有问题,动态代理同时支持多类型的接口代理
public interface IUser {
void setName(String name);
}
2. 然后实现委托类
public class UserImpl implements IUser{
@Override
public void setName(String name) {
Log.i("MALEI"," UserImpl ==> setName");
}
}
3.创建代理类
/**
* 动态代理类
*/
public class ProxyHandler implements InvocationHandler {
private Object mTarget;
public Object newProxyInstance(Object target) {
this.mTarget = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/**
* @param proxy 代理,
* @param method 表示原对象被调用的方法
* @param args 表示方法的参数
* @return
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Log.i("MALEI", "ProxyHandler ==> invoke");
for (int i = 0; i < args.length; i++) {
Log.i("MALEI", "ProxyHandler ==> args:" + args[i]);
}
Object ret = method.invoke(mTarget, args);
Log.i("MALEI", "ProxyHandler ==> 方法执行完成" );
return ret;
}
}
4.客户端执行
ProxyHandler handler = new ProxyHandler();
IUser userManager=(IUser)handler.newProxyInstance(new UserImpl());
userManager.setName("malei");
结果:
2019-08-13 11:38:09.677 10712-10712/com.ml.mvvmpro I/MALEI: ProxyHandler ==> invoke
2019-08-13 11:38:09.677 10712-10712/com.ml.mvvmpro I/MALEI: ProxyHandler ==> args:malei
2019-08-13 11:38:09.677 10712-10712/com.ml.mvvmpro I/MALEI: UserImpl ==> setName
2019-08-13 11:38:09.678 10712-10712/com.ml.mvvmpro I/MALEI: ProxyHandler ==> 方法执行完成