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

項目需求 : 通過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() 的使用

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





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


發佈了48 篇原創文章 · 獲贊 39 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章