23种设计模式-动态代理

笔记 / 2021-03-03

动态代理

为了解决静态代理,代码膨胀问题。

原理

通过反射实现。

实现

ProxyInvocationHandler 实现 InvocationHandler接口

Rentable.java

public interface Rentable {
    void rent();
}

Host.java

public class Host implements  Rentable{
    @Override
    public void rent() {
        System.out.println("房东:我要出租房子");
    }
}

ProxyInvocationHandler.java

public class ProxyInvocationHandler  implements InvocationHandler {
    /**
     * 被代理的接口
     */
    private Object obj;

    private void before(){
        System.out.println("before....");
    }
    private void after(){
        System.out.println("after....");
    }


    public void setObj(Object obj) {
        this.obj = obj;
    }

    public<T> T getObjProxy(Class<T> t){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object invoke = method.invoke(obj, args);
        after();
        return invoke;
    }
}

DynamicProxyTest.java

public class DynamicProxyTest {
    @Test
    public void test(){
        // 创建被代理对象
        Host host = new Host();
        // 创建代理
        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
        // 设置代理对象
        proxyInvocationHandler.setObj(host);
        // 获取代理对象
        Rentable objProxy =proxyInvocationHandler.getObjProxy(Rentable.class);
        objProxy.rent();
        
    }
}
before....
房东:我要出租房子
after....

优点

  • 不会代码膨胀