我使用的是Spring 4.3。是否有可能獲得傳遞給它的方法參數名稱和值?如果可能的話,我相信這可以使用AOP(在建議之前)完成,請給我一個源代碼。Spring 4加入點以獲取方法參數名稱和值
回答
不幸的是,你不能這樣做。這是一個衆所周知的字節碼限制 - 參數名稱不能用反射來獲得,因爲它們並不總是以字節碼存儲。
作爲解決方法,您可以添加其他註釋,如@ParamName(name = "paramName")
。
這樣,您可以通過以下方式獲得PARAMS名稱:
MethodSignature.getMethod().getParameterAnnotations()
UPDATE
由於Java 8,你可以做到這一點
可以得到正式的名稱使用java.lang.reflect.Executable.getParameters方法的任何方法或構造函數的參數。 (類Method和構造函數擴展了類Executable,因此繼承了方法Executable.getParameters。)但是,.class文件默認不存儲形式參數名稱。這是因爲許多生成和使用類文件的工具可能不會期望包含參數名稱的.class文件的較大靜態和動態佔用空間。特別是,這些工具必須處理更大的.class文件,Java虛擬機(JVM)會使用更多的內存。此外,某些參數名稱(如密碼或密碼)可能會公開有關安全敏感方法的信息。
要存儲在一個特定的.class文件形式參數名稱,從而使 反射API來獲取正式的參數名稱,編譯 與α參數選項javac編譯器的源文件。
https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html
在你的AOP建議你可以使用一個JoinPoint的方法來獲取訪問方法和它們的參數。有多個在線和在計算器上的例子。
當然,你可以得到所有的參數,但是你不能得到參數名稱,這是不可能的 –
https://stackoverflow.com/questions/5720494/aspectj-joinpoint-question第一個答案提供了檢索參數名稱和值的代碼示例。這確實需要使用AspectJ。 –
CodeSignature methodSignature = (CodedSignature) joinPoint.getSignature();
String[] sigParamNames = codeSignature.getParameterNames();
你可以得到的方法簽名參數的名稱。
下按預期工作(Java的8 +春5.0.4 + AspectJ的1.8.13):
@Aspect
@Component
public class SomeAspect {
@Around("@annotation(SomeAnnotation)")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
System.out.println("First parameter's name: " + codeSignature.getParameterNames()[0]);
System.out.println("First argument's value: " + joinPoint.getArgs()[0]);
return joinPoint.proceed();
}
}
- 1. 在動態方法中獲取參數名稱和值
- 2. Spring - ModelAttribute和參數名稱
- 3. 是否可以在scala中獲取方法的參數名稱
- 4. 如何以任意名稱的形式獲取spring post參數
- 5. 獲取方法名稱和參數窗體AOP調用類
- 6. SQL加入以獲取字段名稱
- 7. BCEL - 獲取類名稱,元素名稱和方法名稱
- 8. 獲取Spring控制器的名稱和視圖中的方法
- 9. 使用Spring AOP獲取方法參數?
- 10. 獲取參數名稱
- 11. 宏從函數內部獲取函數名稱和參數值
- 12. 有沒有獲取方法參數名稱的Antlr語法?
- 13. 在類和方法名稱中獲取行數的方法
- 14. 獲取包含過濾參數的數據的方法名稱
- 15. 獲取ChildNode名稱和值
- 16. 獲取PropertyInfo名稱和值
- 17. Spring Aop,Web服務: - 可以在某個方面獲取名稱以及值
- 18. Spring AOP根據參數名得到方法參數值
- 19. 如何獲取方法定義中的名稱或參數?
- 20. 如何獲取方法參數的名稱?
- 21. 如何在MethodInterceptor中獲取方法的參數名稱?
- 22. 如何從java類獲取方法參數名稱?
- 23. 如何從mangled名稱獲取方法參數列表?
- 24. 從調用方法獲取參數的名稱
- 25. 從方法參數獲取原始屬性名稱
- 26. 如何從函數表達式獲取方法名稱和參數?
- 27. 我如何獲取方法參數名
- 28. 獲取和寫入調用方法名稱
- 29. 在C中獲取名稱和枚舉值的好方法#
- 30. 動態YASnippet,插入方法名稱和參數
這是可能的。在此頁面上查看我的回答。 –