zoukankan      html  css  js  c++  java
  • 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();
        }
        
    }
  • 相关阅读:
    linux oracle命令行窗口命令上下翻阅
    oracle 转移表空间
    perl字符集处理
    Perl解析JSON数据精解
    处理外壳PROC
    FileIsExe
    写壳前的设计
    SEH结构化异常处理03
    SEH结构化异常处理02
    博客首记
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/9163930.html
Copyright © 2011-2022 走看看