2011-05-12 45 views
2

我被困在這個問題上。我很新,反思。如何獲取使用反射的方法的參數

我有一個方法,說:

void foo(String s, int i){...} 

說有人調用此方法與foo("hey", 5);

我怎樣才能得到的值「哎」及5使用反射投入?當我嘗試這樣做時,我只是得到了一大堆String和Integer對象變量。

+1

@ user743949我認爲我們需要更多的信息來說明你想要達到的目標。什麼是反映什麼? – Wes 2011-05-12 20:53:32

+0

我正在練習,我想輸出所有東西到顯示器。 – user743949 2011-05-12 20:54:35

+2

*你在哪裏*試圖做反射?在'foo'中?我不認爲你可以用反射來「截取」方法調用。你可以檢查一個對象並發現它的屬性,方法,參數等等,但是當有人調用'foo'時不能獲取方法調用。 – 2011-05-12 20:58:21

回答

4

反思是關於在「元」級別訪問程序,所以你可以修改它的細節(對象,類)放在一起。訪問變量和參數的實際值是在通常的「正常」級別完成的。

我不知道爲什麼你不能在通常的「正常,非meta」級別訪問參數,也許你正在嘗試查看堆棧中或其他線程中的方法參數?爲此,您可能需要使用像JDI這樣的調試界面。

8

聽起來好像你在談論AOP(面向方面​​的編程) - 不是反射。一個方法攔截器可以讓你在運行時訪問調用(包括訪問參數)。您如何訪問參數取決於API。

public class MyMethodInterceptor implements MethodInterceptor { 

    public Object invoke(MethodInvocation invocation) throws Throwable { 
     System.out.println("Before: invocation=[" + invocation + "]"); 

     // use MethodInvocation.getArguments() to access the runtime parameters 
     System.out.println(Arrays.toString(methodInvocation.getArguments())); 

     Object rval = invocation.proceed(); 
     System.out.println("Invocation returned"); 
     return rval; 
    } 
} 

注意:AOP是一項先進的技術,您需要做一些功課纔能有效地使用它。有關上述示例的詳細信息,請參閱http://static.springsource.org/spring/docs/2.0.2/reference/aop-api.html

+0

很好的工作知道提問者可能真的想要什麼,沒有提問者表達它! – 2011-05-13 00:13:47

3

我認爲反思是一種錯誤的方式來思考如何實現你想要在這裏做什麼。

將反射想象爲看着一輛汽車,並發現它有車輪,發動機,座椅等,它們是什麼類型。它不是要找出這些部件在特定時刻是如何工作的。我知道這不是一個很好的比喻,但我希望它有幫助。反思意味着你從外面看汽車,並決定它的外觀和能做什麼。找出參數的值是從「內部」完成的。

基本上,如果你有一個java類,你可以使用反射來知道它有什麼方法,屬性以及它們的類型,並且調用它們。但是你想在這裏用反射來做什麼,就像調用一個方法,並從方法的「外部」魔法中找出它的論點。

你說過「我在練習,我想輸出所有內容到顯示器」。爲什麼不直接記錄參數或將它們打印到輸出流?或者正如有人所說,使用調試器。

相關問題