资讯专栏INFORMATION COLUMN

通过JDK动态代理实现拦截器

gghyoo / 2393人阅读

摘要:拦截器拦截器是我们开发中接触比较多的。今天使用动态代理模式来实现拦截器。

拦截器

拦截器是我们开发中接触比较多的。今天使用JDK动态代理模式来实现拦截器。实现过程我们通过代码来展示,代码中有相应的解释:

//拦截器接口
public interface Interceptor {
    /**
     * 调用真实方法之前执行,写调用真实方法的前提逻辑
     * @param proxy 代理对象
     * @param obj 真实对象
     * @param method 方法
     * @param args 方法参数
     * @return
     */
    public boolean before(Object proxy,Object obj,Method method,Object[] args);
    /**
     * 当before方法结果是false时,调用此方法
     * @param proxy
     * @param obj
     * @param method
     * @param args
     */
    public void around(Object proxy,Object obj,Method method,Object[] args);
    /**
     * 调用完真实对象或者执行完around方法之后执行此方法
     * @param proxy
     * @param obj
     * @param method
     * @param args
     */
    public void after(Object proxy,Object obj,Method method,Object[] args);
    
}
//拦截器实现类
public class InterceptorImpl implements Interceptor {

    @Override
    public boolean before(Object proxy, Object obj, Method method, Object[] args) {
        System.out.println("反射方法执行之前的逻辑~~");
        return false;
    }

    @Override
    public void around(Object proxy, Object obj, Method method, Object[] args) {
        System.out.println("执行around方法~~~");
    }

    @Override
    public void after(Object proxy, Object obj, Method method, Object[] args) {
        System.out.println("反射方法之后的逻辑~~");
    }
}
//JDK动态代理所需要的接口
public interface ISayHello {
    public void say();
}
//JDK动态代理接口实现类
public class SayHelloImpl implements ISayHello {

    @Override
    public void say() {
        System.out.println("真实对象逻辑~Hello World!");    
    }

}
//jdk动态代理实现拦截器
public class InterceptorJdkProxy implements InvocationHandler {
    //真实对象
    private Object obj;
    //拦截器权限定名
    private String interceptorClass = null;
    
    public Object bind(Object obj,String interceptorClas) {
        this.obj = obj;
        this.interceptorClass = interceptorClas;
        Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), 
                obj.getClass().getInterfaces(), this);
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //如果没有拦截器,直接走原逻辑
        if(interceptorClass == null) {
            return method.invoke(obj, args);
        }
        //接收真实对象方法
        Object result = null;
        //反射生成拦截器对象
        Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance();
        if(interceptor.before(proxy, obj, method, args)) {
            result = method.invoke(obj, args);
        } else {
            interceptor.around(proxy, obj, method, args);
        }
        interceptor.after(proxy, obj, method, args);
        return result;
    }
}
//测试代码
public class TestInterceptor {
    public static void main(String[] args) {
        InterceptorJdkProxy interceptorJdkProxy = new InterceptorJdkProxy();
        ISayHello bind = (ISayHello) interceptorJdkProxy.bind(new SayHelloImpl(), "interceptor.InterceptorImpl");
        bind.say();
    }
}
测试结果展示 当执行before方法返回为true

当执行before方法返回为false

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69590.html

相关文章

  • Java中的动态代理

    摘要:要明白,动态代理类的存在意义是为了拦截方法并修改逻辑而动态代理的局限性之一就是只能拦截接口所声明的方法。因为动态代理类是继承自业务类,所以该类和方法不能声明成无法继承或重写。者最终都是生成了一个新的动态代理类对象。 动态代理 1、先谈静态代理 对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实...

    CastlePeaK 评论0 收藏0
  • Java动态代理 jdk和cglib的实现比较

    摘要:与静态代理对比,动态代理是在动态生成代理类,由代理类完成对具体方法的封装,实现的功能。本文将分析中两种动态代理的实现方式,和,比较它们的异同。那如何动态编译呢你可以使用,这是一个封装了的库,帮助你方便地实现动态编译源代码。 发现Java面试很喜欢问Spring AOP怎么实现的之类的问题,所以写一篇文章来整理一下。关于AOP和代理模式的概念这里并不做赘述,而是直奔主题,即AOP的实现方...

    h9911 评论0 收藏0
  • 吃透动态代理,解密spring AOP源码(四)

    摘要:值得一提的是由于采用动态创建子类的方式生成代理对象,所以不能对目标类中的方法进行代理。动态代理中生成的代理类是子类,调试的时候可以看到,打开源码可看到实现了和也就实现方法。 前面讲到了动态代理的底层原理,接下来我们来看一下aop的动态代理.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理,一种是基于CGLib的动态代理. ①JDK动态代理:使用JDK创建代理有一个限制...

    Codeing_ls 评论0 收藏0
  • 代理技术简介

    摘要:我是一个很喜欢偷懒的程序猿,一看代理的定义,哇塞,还有这么好的事情居然可以委托别人替我干活那么倒底是不是这样呢别着急,仔细看看本文关于代理技术的介绍,最后我会专门回过头来解释这个问题的。 代理,或者称为 Proxy ,简单理解就是事情我不用去做,由其他人来替我完成。在黄勇《架构探险》一书中,我觉得很有意思的一句相关介绍是这么说的: 赚钱方面,我就是我老婆的代理;带小孩方面,我老婆就是我...

    mykurisu 评论0 收藏0
  • Spring AOP就是这么简单啦

    摘要:是一种特殊的增强切面切面由切点和增强通知组成,它既包括了横切逻辑的定义也包括了连接点的定义。实际上,一个的实现被拆分到多个类中在中声明切面我们知道注解很方便,但是,要想使用注解的方式使用就必须要有源码因为我们要 前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知...

    Jacendfeng 评论0 收藏0

发表评论

0条评论

gghyoo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<