項目需求 : 通過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() 的使用
然後後面具體實現方法的選擇
感謝網路上的前輩大牛分享的知識,謝謝