1. 程式人生 > >AspectJ 切面獲取方法引數並拿到具體的值

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() 的使用

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

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