Java动态代理

既然叫动态代理,那肯定会有静态代理,这里不再详细介绍什么是动态代理

下面,主要讲解动态代理的原理

在接触Spring时,经常能碰到AOP和IOC两个概念,IOC就是依赖注入,AOP的原理的就是动态代理。

首先我们申明一个Target的接口,为其声明一个方法:

public interface Interceptor {

    public void intercept();
}

接着,定义一个Log类和Transaction类来实现这个接口:

public class LogInterceptor implements Interceptor{

    @Override
    public void intercept(){
        System.out.println("日志记录开始");
    }
}
public class TransactionInterceptor implements Interceptor {

    @Override
    public void intercept() {
        System.out.println("事务开启");
    }
}

下面,定义一个动态代理类,必须实现InvocationHandler 这个接口:

public class TargetProxy implements InvocationHandler{

    private Target target;
    private Stack<Interceptor> interceptorStack;
     
    public TargetProxy(Target target, Stack<Interceptor> interceptorStack) {
        this.target = target;
        this.interceptorStack = interceptorStack;
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("invoke");
        for(Interceptor interceptor:interceptorStack){
            interceptor.intercept();
        }
        return method.invoke(target, args);
    }
}

最后是我们的测试类:

public class Test {

    public static void main(String[] args) {
        Stack<Interceptor> interceptorStack =new Stack<>();
        interceptorStack.add(new LogInterceptor());
        interceptorStack.add(new TransactionInterceptor());
         
        Target target = new TargetImpl();
        target = (Target) Proxy.newProxyInstance(target.getClass().getClassLoader(),
                        target.getClass().getInterfaces(),new TargetProxy(target, interceptorStack));
        System.out.println("Start Target");
        target.execute();
    }
    
}
原文地址:https://www.cnblogs.com/zyxiaohuihui/p/9163930.html