利用JDK动态代理机制实现简单拦截器
利用JDK动态代理机制实现简单的多层拦截器
首先JDK动态代理是基于接口实现的,所以我们先定义一个接口
public interface Executer {
    public Object execute(String param);
}
然后我们写一个类来实现该接口,我们将该类成为目标类。接下来我们将要对execute方法进行拦截!
public class SampleExecuter implements Executer {
    public Object execute(String param) {
        System.out.println("SampleExecuter.execute()");
        return "SampleExecuter.execute()" + param;
    }
}
我们需要定义拦截器接口 Interceptor
public interface Interceptor {
    public Object intercept(Invocation invocation) throws Throwable;
}
定义类 Invocation 该类负责调用我们目标对象的方法
public class Invocation {
    private Object target;
    private Method method;
    private Object[] args;
    public Invocation(Object target, Method method, Object[] args) {
        this.target = target;
        this.method = method;
        this.args = args;
    }
    public Object getTarget() {
        return target;
    }
    public void setTarget(Object target) {
        this.target = target;
    }
    public Method getMethod() {
        return method;
    }
    public void setMethod(Method method) {
        this.method = method;
    }
    public Object[] getArgs() {
        return args;
    }
    public void setArgs(Object[] args) {
        this.args = args;
    }
    public Object proceed() throws IllegalAccessException, InvocationTargetException {
        return method.invoke(target, args);
    }
}
代理类的实现
public class PlugIn implements InvocationHandler {
    private Object target;
    private Interceptor interceptor;
    public PlugIn(Object target, Interceptor interceptor) {
        this.target = target;
        this.interceptor = interceptor;
    }
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        return interceptor.intercept(new Invocation(target, method, args));
    }
    /**
     * 通过JDK动态代理Proxy.newProxyInstance返回代理对象
     * @param target 目标对象
     * @param interceptor 拦截器对象
     * @return 代理对象
     */
    public static Object warp(Object target, Interceptor interceptor) {
        Class<?> type = target.getClass();
        return Proxy.newProxyInstance(type.getClassLoader(), type.getInterfaces(),
                                        new PlugIn(target, interceptor));
    }
}
InterceptorChain 用来注册拦截器,并将拦截器与目标对象结合生成代理对象
public class InterceptorChain {
    private List<Interceptor> interceptors = new ArrayList<Interceptor>();
    public void addInterceptor(Interceptor interceptor) {
        interceptors.add(interceptor);
    }
    public Object pluginAll(Object target) {
        for (Interceptor interceptor : interceptors) {
            target = PlugIn.warp(target, interceptor);
        }
        return target;
    }
}
最后写俩个拦截器来测试我们的程序吧
public class IntOne implements Interceptor {
    public Object intercept(Invocation invocation) throws IllegalAccessException, InvocationTargetException {
        System.out.println("IntOne.intercept()-begin");
        Object result = invocation.proceed();
        System.out.println("IntOne.intercept()-end");
        return result;
    }
}
public class IntTwo implements Interceptor {
    public Object intercept(Invocation invocation) throws IllegalAccessException, InvocationTargetException {
        System.out.println("IntTwo.intercept()-begin");
        Object result = invocation.proceed();
        System.out.println("IntTwo.intercept()-end");
        return result;
    }
}
public class Demo {
    public static void main(String[] args) {
        SampleExecuter target = new SampleExecuter();
        InterceptorChain chain = new InterceptorChain();
        chain.addInterceptor(new IntOne());
        chain.addInterceptor(new IntTwo());
        Executer executer = (Executer) chain.pluginAll(target);
        Object result = executer.execute("params");
        System.out.println(result);
    }
}
执行结果
IntTwo.intercept()-begin
IntOne.intercept()-begin
SampleExecuter.execute()
IntOne.intercept()-end
IntTwo.intercept()-end
SampleExecuter.execute()params
利用JDK动态代理机制实现简单拦截器的更多相关文章
- 深度剖析JDK动态代理机制
		
摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...
 - 深度剖析java中JDK动态代理机制
		
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
 - JDK动态代理机制
		
JDK Proxy OverView jdk的动态代理是基于接口的.必须实现了某一个或多个随意接口才干够被代理.并且仅仅有这些接口中的方法会被代理. 看了一下jdk带的动态代理api,发现没有样例实在 ...
 - JDK 动态代理 源码简单分析
		
代理的作用就是在访问真实对象之前或者之后可以额外加入一些操作. JDK 的动态代理 只需要 5 步. 真实对象必须要实现接口,首先创建一个接口 public interface HelloWorld ...
 - 基于 JDK 的动态代理机制
		
『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...
 - Mybatis之拦截器原理(jdk动态代理优化版本)
		
在介绍Mybatis拦截器代码之前,我们先研究下jdk自带的动态代理及优化 其实动态代理也是一种设计模式...优于静态代理,同时动态代理我知道的有两种,一种是面向接口的jdk的代理,第二种是基于第三方 ...
 - Java动态代理机制——JDK
		
动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...
 - SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
		
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
 - 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解
		
代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...
 
随机推荐
- ASP.NET#LinqDataSource控件配置对象模型时遇到的问题
			
使用LinqDataSource控件时,配置数据源的时候,发现没有DataContext对象可选,但已通过可视化操作完成了对象模型的建立.这个时候,可以通过现在Default.aspx.cs文件中做如 ...
 - HDUOJ-----4506小明系列故事——师兄帮帮忙
			
小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
 - map reduce相关程序
			
Test_1.java /** * Hadoop网络课程模板程序 * 编写者:James */ import java.io.IOException; import java.text.DateFor ...
 - 将form表单转化为json数据
			
参考地址:https://github.com/hongymagic/jQuery.serializeObject
 - DataTime? 的 GetValueOrDefault() 方法
			
DataTime? 转换为 DataTime类型 就可以调用 ToString() 自定义格式 @item.CreateDate.GetValueOrDefault().ToString(" ...
 - 最短路径 - 弗洛伊德(Floyd)算法
			
为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...
 - Linux递归解压缩一个目录下的全部文件
			
gunzip -r hongchangfirst/data 怎样递归删除那些剩余的非log结尾的文件? 先列出确认一下: find hongchangfirst/data -type f ! -nam ...
 - Android仿联系人列表分组悬浮列表实现,自己定义PinnedHeaderListView实现
			
效果 (关于gif怎么生成的.我先录手机的屏幕得到mp4文件.然后用这个网址:https://cloudconvert.com/mp4-to-gif 进行的mp4转换gif,使用的时候须要又一次选择g ...
 - tmux安装
			
安装tmux sudo yum -y install tmux 修改tmux配置 cat > /root/.tmux.conf <<EOF set-option -g default ...
 - Python 列表 count() 方法
			
描述 Python 列表 count() 方法用于统计某个元素在列表中出现的次数. 语法 count() 方法语法: L.count(obj) 参数 obj -- 列表中统计的对象. 返回值 返回元素 ...