Spring Aop 如何獲取參數(shù)名參數(shù)值
前言:
有時(shí)候我們在用Spring Aop面向切面編程,需要獲取連接點(diǎn)(JoinPoint)方法參數(shù)名、參數(shù)值。
環(huán)境:
- Mac OSX
- Intellij IDEA
- Spring Boot 2x
- Jdk 1.8x
Code:
package com.example.aopdemo.aop; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.CodeSignature; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * DemoAop * Create by Gray(Ganguocai@outlook.com) */ @Aspect @Component @Slf4j public class DemoAop { /** * 環(huán)繞通知 * @param proceedingJoinPoint * @return * @throws Throwable */ @Around(value = "execution(* com.example.aopdemo..*(..)))") public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { log.debug("執(zhí)行前:"); Map<String, Object> params = getNameAndValue(proceedingJoinPoint); for (Map.Entry<String, Object> entry : params.entrySet()) { System.out.println("name: " + entry.getKey() + " value: " + entry.getValue()); } Object object = proceedingJoinPoint.proceed(); //執(zhí)行連接點(diǎn)方法,object:方法返回值 log.debug("執(zhí)行后:"); return object; } /** * 獲取參數(shù)Map集合 * @param joinPoint * @return */ Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) { Map<String, Object> param = new HashMap<>(); Object[] paramValues = joinPoint.getArgs(); String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames(); for (int i = 0; i < paramNames.length; i++) { param.put(paramNames[i], paramValues[i]); } return param; } }
AOP切面獲取參數(shù)的一個(gè)小技巧
一般來說,我們的參數(shù),都是通過json傳遞的,那么這個(gè)問題就轉(zhuǎn)化成了,從json中獲取指定字符串的問題。
OK,這個(gè)問題就簡單了。
如下:
public static void main(String[] args) { // 這里JSONObject是fastjson-1.2.41.jar包下的 JSONObject jsonObject = JSON.parseObject("{\"timeStamp\":21602756894612,\"status\":0,\"results\":{\"userName\":\"yang20102\",\"userLevel\":\"3\"},\"errorCode\":null,\"errorMessage\":null}"); // 獲取json最外層字符串 Object timeStamp = jsonObject.get("timeStamp"); System.out.println("timeStamp:" + timeStamp); // 獲取復(fù)雜對象 Object results = jsonObject.get("results"); JSONObject jsonObjectResults = JSON.parseObject(results.toString()); Object userName = jsonObjectResults.get("userName"); System.out.println("userName:" + userName); }
實(shí)例json如下:
{ "timeStamp": 21602756894612, "status": 0, "results": { "userName": "yang20102", "userLevel": "3" }, "errorCode": null, "errorMessage": null }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot自定義對象參數(shù)超詳細(xì)介紹作用
SpringBoot通過自定義對象參數(shù),可以實(shí)現(xiàn)自動類型轉(zhuǎn)換與格式化,并可以級聯(lián)封裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09SpringBoot this調(diào)用@Bean效果詳解
這篇文章主要介紹了在一個(gè)@Bean方法內(nèi),this調(diào)用同一個(gè)類的@Bean方法會有什么效果,我們可以通過bean的名稱、bean的類型或者bean的名稱+類型來獲取容器中的bean2023-02-02Java模擬實(shí)現(xiàn)機(jī)場過安檢處理流程
這篇文章主要為大家詳細(xì)介紹了用Java模擬實(shí)現(xiàn)機(jī)場安全檢查流程的案例,涉及線程的相關(guān)知識,由子線程不斷的檢查通過旅客,感興趣的小伙伴們可以參考一下2022-04-04springboot的http.server.requests服務(wù)請求流程源碼
這篇文章主要為大家介紹了springboot的http.server.requests服務(wù)請求流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Java IO創(chuàng)建目錄和文件實(shí)例代碼
本篇文章給大家分享了Java IO創(chuàng)建目錄和文件的實(shí)例代碼,過程很簡單,大家可以測試參考下。2018-02-02Java代理模式之靜態(tài)代理與動態(tài)代理的區(qū)別及優(yōu)缺點(diǎn)
代理模式是一種常用的設(shè)計(jì)模式,它允許通過引入一個(gè)代理對象來控制對目標(biāo)對象的訪問,在Java中,代理模式被廣泛應(yīng)用,它可以提供額外的功能,如權(quán)限檢查、緩存、日志記錄等,本文將介紹靜態(tài)代理與動態(tài)代理的區(qū)別及優(yōu)缺點(diǎn),需要的朋友可以參考下2023-06-06Java中LocalCache本地緩存實(shí)現(xiàn)代碼
本篇文章主要介紹了Java中LocalCache本地緩存實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05解決dubbo啟動報(bào)服務(wù)注冊失敗Failed?to?register?dubbo
這篇文章主要介紹了解決dubbo啟動報(bào)服務(wù)注冊失敗Failed?to?register?dubbo問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12