AspectJ 切面獲取方法引數並拿到具體的值
阿新 • • 發佈:2019-02-20
專案需求 : 通過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() 的使用
然後後面具體實現方法的選擇
感謝網路上的前輩大牛分享的知識,謝謝