动态代理

1、需求在现有方法前后增加两行日志

使用静态代理

public interface Waiter {
    
    public void serve();
}

public class ManWaiter implements Waiter {

    @Override
    public void serve() {
        System.out.println("服务中");
    }

}
public class ProxyWaiter implements Waiter{
    
    private Waiter waiter;
    public ProxyWaiter(Waiter waiter) {
        this.waiter=waiter;
    }
    @Override
    public void serve() {
        System.out.println("执行前");
        waiter.serve();
        System.out.println("执行后");
    }   
}

可以发现使用静态代理的缺陷:每个类都需要一个代理类。

使用动态代理

public class Test {

    public static void main(String[] args) {
        Waiter waiter=(Waiter)getProxy(new ManWaiter());
        waiter.serve();
    }
    private static Object getProxy(Object target) {
        Object proxy=Proxy.newProxyInstance(Test.class.getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("执行前");
                Object result = method.invoke(target, args);
                System.out.println("执行后");
                return result;
            }
        });
        return proxy;
    }
}

静态代理是在编译写好相应的代理类的java代码,生成class字节码,然后去创建代理对象。

动态代理:动态的创建一组指定接口的实现类对象。(动态代理直接根据接口和类加载器生成代理,跳过了java代码生成class字节码的过程)

更好的博客:https://www.zhihu.com/question/20794107

你可能感兴趣的:(动态代理)