2012-12-27 47 views
5

是否有可能使用反射api將參數傳遞給Java中的方法?Java - 獲取傳遞給方法的參數?

是否有可能使用AspectJ等AOP庫來實現這個目標?

我在Android上運行。

public abstract class Base { 

    public void printArguments() { 

     //Here I need to get access to arg1, arg2, arg3 
    } 

} 

public class MyClass extends Base { 

    public void (String arg1, Integer arg2, String arg3) { 

     super.printArguments();  
    } 
} 
+0

是U試圖打印任意數量的參數在一個單一的方法作爲正在添加參數? –

+0

是的,我正在爲我的應用程序設計緩存層,並且我想使用類名稱,方法名稱,參數和註釋(CacheForMinute)作爲鍵 – aryaxt

回答

3

是否有可能實現這一目標使用AOP庫,例如AspectJ的?

是的,當然。這是一種典型的初學者的AspectJ中的運動,像這樣:

public class SampleClass { 
    public SampleClass() { super(); } 
    public SampleClass(String s) { this(); } 
    public SampleClass(int i) { this(); } 
    public void method01(String s, Number n, Throwable t) {} 
    public void method02(int i, String s, double d) {} 
    public void method03(String s) {} 
    public void method04() {} 
    public void method05(String s, Number n, double d) {} 

    public static void main(String[] args) { 
     new SampleClass().method01("foo", new Integer(11), new RuntimeException("error")); 
     new SampleClass("test").method02(11, "bar", Math.PI); 
     new SampleClass(123).method03("zot"); 
     new SampleClass("another test").method04(); 
     new SampleClass(456).method05("baz", new Integer(11), Math.E); 
    } 
} 

現在你只需要編寫可截取你的所有方法執行方面(以及可選的構造函數執行,如下圖所示):

public aspect MethodArgsAspect { 
    pointcut allMethods()  : execution(* *(..)); 
    pointcut allConstructors() : execution(*.new(..)); 

    before() : !within(MethodArgsAspect) && (allMethods() || allConstructors()) { 
     System.out.println(thisJoinPointStaticPart.getSignature()); 
     for (Object arg : thisJoinPoint.getArgs()) 
      System.out.println(" " + arg); 
    } 
} 

當運行SampleClass.main,這一方面會打印:

void SampleClass.main(String[]) 
    [Ljava.lang.String;@7fdcde 
SampleClass() 
void SampleClass.method01(String, Number, Throwable) 
    foo 
    11 
    java.lang.RuntimeException: error 
SampleClass() 
SampleClass(String) 
    test 
void SampleClass.method02(int, String, double) 
    11 
    bar 
    3.141592653589793 
SampleClass() 
SampleClass(int) 
    123 
void SampleClass.method03(String) 
    zot 
SampleClass() 
SampleClass(String) 
    another test 
void SampleClass.method04() 
SampleClass() 
SampleClass(int) 
    456 
void SampleClass.method05(String, Number, double) 
    baz 
    11 
    2.718281828459045 
+0

它會攔截程序的所有方法。有沒有辦法動態地做到這一點,而應用程序正在運行,並且需要識別傳遞的方法參數值? – Nitul

+0

我會很高興回答你的問題,如果(a)你創建一個新的,而不是劫持這個,因爲你想要的東西不同於這裏所要求和回答的東西,(b)你以一種我能理解的方式提問,還提供說明性的示例代碼(如果可能,可執行),所以我有一些事情可以爲您實際修復或實施。你可以在這裏的另一個評論中添加一個新問題的鏈接,所以我可以找到它。非常感謝你。 – kriegaex

1

你可能在你的,因爲我不知道,如果它可以在反射來完成實現這一邏輯

Java的可變參數

我會做這種替代

www.java.net/pub/a/today/2004/04/19/varargs.html

你的方法

public void printArguments(Obeject... argArr) { 

    //Here I need to get access to arg1, arg2, arg3 
    //TODO iterate over object array (ie: argArr) and print it. 
    } 

,並在你的子類

public void someMethodName(String arg1, Integer arg2, String arg3) { 

    super.printArguments(arg1,arg2); 
    super.printArguments(arg1,arg2,arg3);  //the print argument can be called with any number of argument 
} 
+0

我不喜歡這樣做,我更願意做所有事情自動化,但如果我不能獲得某種方法攔截工作,我可能會與此一起去。謝謝 – aryaxt