利用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动态代理机制实现简单拦截器的更多相关文章

  1. 深度剖析JDK动态代理机制

    摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...

  2. 深度剖析java中JDK动态代理机制

    https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...

  3. JDK动态代理机制

    JDK Proxy OverView jdk的动态代理是基于接口的.必须实现了某一个或多个随意接口才干够被代理.并且仅仅有这些接口中的方法会被代理. 看了一下jdk带的动态代理api,发现没有样例实在 ...

  4. JDK 动态代理 源码简单分析

    代理的作用就是在访问真实对象之前或者之后可以额外加入一些操作. JDK  的动态代理 只需要 5 步. 真实对象必须要实现接口,首先创建一个接口 public interface HelloWorld ...

  5. 基于 JDK 的动态代理机制

    『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...

  6. Mybatis之拦截器原理(jdk动态代理优化版本)

    在介绍Mybatis拦截器代码之前,我们先研究下jdk自带的动态代理及优化 其实动态代理也是一种设计模式...优于静态代理,同时动态代理我知道的有两种,一种是面向接口的jdk的代理,第二种是基于第三方 ...

  7. Java动态代理机制——JDK

    动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...

  8. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  9. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

随机推荐

  1. 彻底理解Python切片

    关于list的insert函数 list#insert(ind,value)在ind元素前面插入value 首先对ind进行预处理:如果ind<0,则ind+=len(a),这样一来ind就变成 ...

  2. PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora原理解释

    PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora原理解释 oracle网络配置三个配置文件 lis ...

  3. Http Analyzer Std V3.3.1.140 汉化补丁

    http://www.cnblogs.com/nicch/archive/2008/08/30/ha_httpanalyzerstdv3.html Http Analyzer Std V3.3.1.1 ...

  4. 在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]

    在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持 ...

  5. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  6. Posix共享内存区

    1.概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...

  7. Objective-C学习笔记(四)——OC实现最简单的数学运算

    本篇帖子会实现使用OC的最简单的加减乘除运算.学习的知识点包含变量定义.运算方法,格式化输出等概念.主要学习主要的语法,事实上和C语言的语法还是比較相似的. 具体代码仅仅要写在main方法中即可了.具 ...

  8. ORACLE11g中毒恢复

    很不幸的,win2003server疏于管理,中毒了,清理了病毒以后.oracle也瘫痪了.上次备份还在一周前,这一周的数据咋办? 首先的想法,是另找一台机器,装个一模一样的oracle.再把被删的文 ...

  9. hibernate,动态更新,插入 dynamic-insert,dynamic-update 我有话要说 ---稍后整理

    http://dreamzhong.iteye.com/blog/1207377 http://blog.csdn.net/hsuxu/article/details/8108326 @org.hib ...

  10. Hive查看table在HDFS上的存储路径

    hive>show databases;hive>use databasename;hive>show create table tablename; --查看table的存储路径h ...