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