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();
        }
        
    }
  • 相关阅读:
    探索c#之一致性Hash详解
    Redis系列(三)-Redis发布订阅及客户端编程
    Redis系列(二)-Hredis客户端设计及开源
    关于电脑操作一些高效的方法工具
    探索c#之递归APS和CPS
    探索C#之系列目录导航
    探索c#之不可变数据类型
    SOA相关资料整理分享
    探索c#之尾递归编译器优化
    探索c#之函数创建和闭包
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/9163930.html
Copyright © 2011-2022 走看看