AspectJ 切面擷取方法參數並拿到具體的值

來源:互聯網
上載者:User

項目需求 : 通過AspectJ 實現切面 並且可以擷取具體的參數值和類型

實現目的 : 背景 通過切面擷取不同方法中不同參數對象裡共有的值

實現原理 : 使用AspectJ 進行攔截 然後擷取Object 參數 再通過反射進行取值


下面是實現方法:

首先是定義AspectJ檔案 也就是.aj檔案

public aspect UpdateServiceAspectJ {    public pointcut updateServices1(Object model)://這個model要和參數名稱相同    execution(public * *.*.*.*Controller.*(..)) && @annotation(CustomUpdateServices) && args(model); //定義使用這個參數 model    after (Object o) returning() :updateServices1(o){//後置通知        ReflectClass.reflect(o); //通過反射方法擷取參數System.out.println(ReflectClass.XQID);//Obj 共有的參數
    }
@CustomUpdateServices //這個是我自訂的 沒有任何內部參數 就是用來進行攔截找到方法的作用

單純的是用切面要擷取參數的值得話,需要用到緩衝,但緩衝的配置又很麻煩 一般還用不到

而單純的註解反射我們也是擷取不到參數的所以我們這裡需要用 切面 然後是代理 擷取到參數然後通過反射可以得到參數的值

我們可以通過AspectJ來進行一個 切面 

我們這裡要注意的是 配置攔截器的是後 我們的參數名稱要和攔截髮個具體的參數名稱相同 

代理的參數只要類型相同就可以了 

然後就是我們的通過反射擷取Object 共有的值

ReflecClass

package com.hnmzhc.web.commons.updateService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.lang.reflect.Field;/** * Created by DavidG on 2016/11/8. * @XQID 小區id * @USERID 使用者id */public class ReflectClass {    public static final Logger logger = LoggerFactory.getLogger(ReflectClass.class);    public static Integer XQID = 0;    public static Integer WYID = 0;    public static Integer USERID = 0;    /**傳入參數     * 通過反射 擷取當前類的所有屬性     * 判斷是否存在xqid 和userid     * 如果有就存入當前類的靜態屬性中     * @param obj     */    public static void reflect(Object obj) {        if (obj == null) return;        Field[] fields = obj.getClass().getDeclaredFields();        for (int j = 0; j < fields.length; j++) {            fields[j].setAccessible(true);            try {                // 欄位名                if(fields[j].getName().equals("xqId")){                    if(fields[j].get(obj)!=null){//進行效驗                        XQID = (Integer)fields[j].get(obj);//賦值                    }                }else if(fields[j].getName().equals("userId")){                    if(fields[j].get(obj)!=null){                        USERID = (Integer)fields[j].get(obj);                    }                }else if(fields[j].getName().equals("wyId")){                    if(fields[j].get(obj)!=null){                        WYID = (Integer)fields[j].get(obj);                    }                }                logger.warn(String.format("XQID = %n , WYID = %n, USERID = %n", XQID, WYID,USERID));//列印日誌            } catch (Exception e) {                e.printStackTrace();            }        }    }}
這樣我們就可以進行一個切面擷取方法參數的功能了

當然如果你這邊參數類型都是一樣的那麼就更容易了

直接在AspectJ 中把Object 的類型替換成你自己的pojo/bean 就可以了 

一定要注意名稱和 args() 的使用

然後後面具體實現方法的選擇





感謝網路上的前輩大牛分享的知識,謝謝


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.