成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

通過JDK動態(tài)代理實現(xiàn)攔截器

gghyoo / 2417人閱讀

摘要:攔截器攔截器是我們開發(fā)中接觸比較多的。今天使用動態(tài)代理模式來實現(xiàn)攔截器。

攔截器

攔截器是我們開發(fā)中接觸比較多的。今天使用JDK動態(tài)代理模式來實現(xiàn)攔截器。實現(xiàn)過程我們通過代碼來展示,代碼中有相應的解釋:

//攔截器接口
public interface Interceptor {
    /**
     * 調(diào)用真實方法之前執(zhí)行,寫調(diào)用真實方法的前提邏輯
     * @param proxy 代理對象
     * @param obj 真實對象
     * @param method 方法
     * @param args 方法參數(shù)
     * @return
     */
    public boolean before(Object proxy,Object obj,Method method,Object[] args);
    /**
     * 當before方法結果是false時,調(diào)用此方法
     * @param proxy
     * @param obj
     * @param method
     * @param args
     */
    public void around(Object proxy,Object obj,Method method,Object[] args);
    /**
     * 調(diào)用完真實對象或者執(zhí)行完around方法之后執(zhí)行此方法
     * @param proxy
     * @param obj
     * @param method
     * @param args
     */
    public void after(Object proxy,Object obj,Method method,Object[] args);
    
}
//攔截器實現(xiàn)類
public class InterceptorImpl implements Interceptor {

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

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

    @Override
    public void after(Object proxy, Object obj, Method method, Object[] args) {
        System.out.println("反射方法之后的邏輯~~");
    }
}
//JDK動態(tài)代理所需要的接口
public interface ISayHello {
    public void say();
}
//JDK動態(tài)代理接口實現(xiàn)類
public class SayHelloImpl implements ISayHello {

    @Override
    public void say() {
        System.out.println("真實對象邏輯~Hello World!");    
    }

}
//jdk動態(tài)代理實現(xiàn)攔截器
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();
    }
}
測試結果展示 當執(zhí)行before方法返回為true

當執(zhí)行before方法返回為false

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/69590.html

相關文章

  • Java中的動態(tài)代理

    摘要:要明白,動態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因為動態(tài)代理類是繼承自業(yè)務類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態(tài)代理類對象。 動態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業(yè)務方法,代理類持有真實類的對象實例,在重寫業(yè)務方法中通過調(diào)用真實...

    CastlePeaK 評論0 收藏0
  • Java動態(tài)代理 jdk和cglib的實現(xiàn)比較

    摘要:與靜態(tài)代理對比,動態(tài)代理是在動態(tài)生成代理類,由代理類完成對具體方法的封裝,實現(xiàn)的功能。本文將分析中兩種動態(tài)代理的實現(xiàn)方式,和,比較它們的異同。那如何動態(tài)編譯呢你可以使用,這是一個封裝了的庫,幫助你方便地實現(xiàn)動態(tài)編譯源代碼。 發(fā)現(xiàn)Java面試很喜歡問Spring AOP怎么實現(xiàn)的之類的問題,所以寫一篇文章來整理一下。關于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實現(xiàn)方...

    h9911 評論0 收藏0
  • 吃透動態(tài)代理,解密spring AOP源碼(四)

    摘要:值得一提的是由于采用動態(tài)創(chuàng)建子類的方式生成代理對象,所以不能對目標類中的方法進行代理。動態(tài)代理中生成的代理類是子類,調(diào)試的時候可以看到,打開源碼可看到實現(xiàn)了和也就實現(xiàn)方法。 前面講到了動態(tài)代理的底層原理,接下來我們來看一下aop的動態(tài)代理.Spring AOP使用了兩種代理機制:一種是基于JDK的動態(tài)代理,一種是基于CGLib的動態(tài)代理. ①JDK動態(tài)代理:使用JDK創(chuàng)建代理有一個限制...

    Codeing_ls 評論0 收藏0
  • 代理技術簡介

    摘要:我是一個很喜歡偷懶的程序猿,一看代理的定義,哇塞,還有這么好的事情居然可以委托別人替我干活那么倒底是不是這樣呢別著急,仔細看看本文關于代理技術的介紹,最后我會專門回過頭來解釋這個問題的。 代理,或者稱為 Proxy ,簡單理解就是事情我不用去做,由其他人來替我完成。在黃勇《架構探險》一書中,我覺得很有意思的一句相關介紹是這么說的: 賺錢方面,我就是我老婆的代理;帶小孩方面,我老婆就是我...

    mykurisu 評論0 收藏0
  • Spring AOP就是這么簡單啦

    摘要:是一種特殊的增強切面切面由切點和增強通知組成,它既包括了橫切邏輯的定義也包括了連接點的定義。實際上,一個的實現(xiàn)被拆分到多個類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因為我們要 前言 只有光頭才能變強 上一篇已經(jīng)講解了Spring IOC知識點一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評論0 收藏0

發(fā)表評論

0條評論

gghyoo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<