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字节码的过程)
网友评论