利用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. PHP关于进程池的优化

    本文打算从另一个角度来讨论问题,教大家如何配置高效的环境,如此同样能够达到优化的目的. pool 一个让人沮丧的消息是绝大多数 PHP 程序员都忽视了池的价值.这里所说的池可不是指数据库连接池之类的东 ...

  2. PHP-线程安全与非线程安全版本的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  3. 2017年WorkApplication牛客网线上机试题

    WorkApplication是一家日企,主要办公地在东京.新加坡.上海等地. 第一题:n的全排列中有多少个排列逆序数为k 输入两个数字n,k,两个数字的范围都是[1,1000]. 输出:n的全排列中 ...

  4. MQTT Stresser

    go环境请参考https://www.cnblogs.com/saryli/p/9833253.html Load testing tool to stress MQTT message broker ...

  5. 订阅mosquitto服务器状态各主题

    mosquitto_sub -v -t \$SYS/broker/client MQTT客户端可以通过订阅位于$SYS层次下的主题来查看mosquitto服务器的状态信息.标记为Static的主题对于 ...

  6. Linux标识进程

    一.前言 其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核.随着linux container.pid namespace等概念的引入,进程标识方面已经有了天翻 ...

  7. Linux进程学习 - 孤儿进程和守护进程

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...

  8. poj 3735 Training little cats(构造矩阵)

    http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...

  9. openssl之EVP系列之9---EVP_Digest系列函数的一个样例

    openssl之EVP系列之9---EVP_Digest系列函数的一个样例     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译     (作者:Drago ...

  10. es6编写generator报错

    首先babel基础包(不安装额外东西)并不是支持完整的es6语言 自己写的如下代码 let generator = function* () { ; ,,]; ; }; var gen = gener ...