动态代理

梦想的初衷 提交于 2020-03-05 11:51:36

动态代理我个人理解是

    给原对象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("沙雕");

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!