2011-04-19 91 views
8

我目前使用JoinPoint來捕獲在運行時傳遞給服務方法的參數。儘管JoinPoint幫助我檢索參數值,但我發現它沒有提供任何良好的API來檢索參數名稱,參數類型和參數值,當傳遞的參數是數組等時。AspectJ JoinPoint問題

下面是一個示例:

public void doIt(String user, Attribute[] attr, Integer[] i, boolean bool, List<Attribute> list){.....} 

對於上述方法中,當我使用JoinPoint.getArgs(),我看到這是一個陣列或集合的參數垃圾值。如果參數是數組或集合,我如何驗證它們是否是其中的一個,如何遍歷它們以檢索單個值?

有什麼建議嗎? 感謝

回答

20

這應該工作:

MethodSignature signature = (MethodSignature)joinPoint.getSignature(); 
String[] parameterNames = signature.getParameterNames(); 
Object[] parameterValues = joinPoint.getArgs(); 

的parameterNames應該與您在

更新1已經過去了。你可能與調試符號編譯關閉 - (明確傳遞javac的 - g:無,或通過maven/ant中的標誌)。關閉調試符號後,名稱將不可用,並由編譯器替換爲args1等。嘗試使用未顯式關閉的調試符號進行編譯。

+0

直升機,這似乎並沒有工作。它返回arg0 arg1 arg2 arg3 arg4等 – soontobeared 2011-04-20 13:01:51

+0

我更新了我的答案,您可能已關閉調試符號。嘗試不顯式關閉調試符號,然後應正確檢索參數名稱。 – 2011-04-20 13:40:54

+0

@Biju你知道如何打開maven中的調試符號嗎? – Modi 2014-05-21 10:11:34

2

AspectJ切入點

public pointcut pointcutName(): 
     execution(* ClassName.method(..)); 

獲取方法的參數名

before():pointcutName(){ 
String[] paramNames = ((CodeSignature) thisJoinPointStaticPart 
       .getSignature()).getParameterNames(); 
for(String paramName:paramNames){ 
      System.out.println(paramName); 
     } 
} 

獲取參數值:

before():pointcutName(){ 
Object[] paramValues = thisJoinPoint.getArgs(); 

for (Object object:paramValues){ 
     System.out.println(object.toString); 
     } 
} 

獲取方法返回值:

after() returning(Object objectReturn) :pointcutName(){ 
    System.out.println(objectReturn); 
}