专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 动态代理和静态代理的区别

动态代理和静态代理的区别

更新时间:2022-11-17 10:43:49 来源:赢咖4 浏览334次

静态代理

静态代理通常是对原有业务逻辑的扩展。

代理的三要素

通用接口

public interface Action {
    public void doSomething();
}

实物

public class RealObject implements Action{
    public void doSomething() {
        System.out.println("do something");
    }
}

代理对象

public class Proxy implements Action {
    private Action realObject;
    public Proxy(Action realObject) {
        this.realObject = realObject;
    }
    public void doSomething() {
        System.out.println("proxy do");
        realObject.doSomething();
    }
}

动态代理

通过使用动态Proxy,我们可以在运行时动态生成一个持有RealObject并实现Proxy接口的Proxy,并注入相同的扩展逻辑。

使用动态代理

public class DynamicProxyHandler implements InvocationHandler {
    private Object realObject;
    public DynamicProxyHandler(Object realObject) {
        this.realObject = realObject;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //Agent extension logic
        System.out.println("proxy do");
        return method.invoke(realObject, args);
    }
}

invoke 方法实现了要扩展的公共函数

public static void main(String[] args) {
        RealObject realObject = new RealObject();
        Action proxy = (Action) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Action.class}, new DynamicProxyHandler(realObject));
        proxy.doSomething();
}

它们之间的区别

静态代理只能用于相应的类。如果有很多类,则需要很多代理。动态代理就是为了弥补静态代理的这一缺陷。通过使用动态Proxy,我们可以在运行时动态生成一个持有RealObject并实现Proxy接口的Proxy,并注入相同的扩展逻辑。即使你要Proxy的RealObject是不同的对象,甚至是不同的方法,你也可以使用动态Proxy来扩展功能。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>