2017-06-19 36 views

回答

0

不幸的是,你不能這樣做。這是一個衆所周知的字節碼限制 - 參數名稱不能用反射來獲得,因爲它們並不總是以字節碼存儲。

作爲解決方法,您可以添加其他註釋,如@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

+0

這是可能的。在此頁面上查看我的回答。 –

-1
+0

當然,你可以得到所有的參數,但是你不能得到參數名稱,這是不可能的 –

+0

https://stackoverflow.com/questions/5720494/aspectj-joinpoint-question第一個答案提供了檢索參數名稱和值的代碼示例。這確實需要使用AspectJ。 –

0
CodeSignature methodSignature = (CodedSignature) joinPoint.getSignature(); 
String[] sigParamNames = codeSignature.getParameterNames(); 

你可以得到的方法簽名參數的名稱。

0

下按預期工作(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(); 
    } 
} 
相關問題