动态代理我个人理解是
给原对象A添加个代理对象,然后通过代理对象去操纵原对象A, 也就是中介,例如房屋中介
动态代理三个角色
真实对象(A),,代理对象,,抽象对象(接口)
特点是
更灵活,耦合性低,通过一个代理类就可以解决多个真实对象,但是因为单继承,只能来实现接口
原理是
通过反射获取到代理类的class对象,然后获取到构造器,通过构造器获取到代理类的实例
常用的retrofit内部就是通过动态代理来实现的
自己写的,凑合看吧, 哪里有不行的,欢迎指正
//抽象角色
public interface IProxy {
void show(String s);
}
//代理角色
public class ProxySubject implements InvocationHandler{
private static final String TAG = "ProxySubject";
//持有的被代理的对象
public Object object;
public void setSubject(Object obj){
object =obj;
}
//通过代理类 创建代理对象
public Object getInstance(){
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),this) ;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doSomeBefore();
Object result = method.invoke(object, args);
doSmoneAfter();
return result;
}
private void doSmoneAfter() {
Log.e(TAG, "doSmoneAfter: 调用后");
}
private void doSomeBefore() {
Log.e(TAG, "doSmoneAfter: 调用前");
}
}
//真实角色
public class RealSubject implements IProxy {
private static final String TAG = "RealSubject";
@Override
public void show(String s) {
Log.e(TAG, "show: ---"+s);
}
}
//具体使用
ProxySubject proxySubject = new ProxySubject();
RealSubject realSubject = new RealSubject();
proxySubject.setSubject(realSubject);
IProxy instance = (IProxy) proxySubject.getInstance();
instance.show("沙雕");
来源:oschina
链接:https://my.oschina.net/fbf8866/blog/3188466