2013-05-13 152 views
0

如何獲取調用方法的參數值?獲取調用方法的參數值

我有兩個類,即包含兩個方法mthA(在類A)和mthB(在類B)中的類A和類B的場景。 mthA調用mthB。現在我想在mthB中知道所有參數已傳遞給mthA。這基本上是爲了記錄和處理異常。我能夠獲得調用類的類名,例如類A和調用mthB的方法名,即mthA。但我堅持要獲取mthA的參數。

Thread.currentThread().getStackTrace()[1].getClassName() 

這給了我調用方法即A類

Thread.currentThread().getStackTrace()[2].getMethodName() 

這讓我即mthA調用方法的方法名的類名。

如果以某種方式,我可以得到整個方法本身,然後我可以通過使用getParameters()傳遞給此方法的方法參數。

回答

0

有最簡單的方法還是有必要使用Reflection ..?

如果你想知道的是通過什麼參數mthA然後傳遞相同的參數,以mthB還例如:

mthA(1stParam, 2ndParam, ...){ 
    mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);   
    ... 
} 
0

有沒有簡單的方法來調用方法的參數值,(如果你不能改變參數被調用的方法包含並傳遞調用參數值)。

使用像Thread提供的一些API,我們可以像類/方法名稱那樣獲取靜態信息,但不會獲得像參數值這樣的運行時信息。一種方法是在某處存儲和管理這種信息,並在需要時顯示日誌/異常情況。我不認爲在java中有一個API。

0

如果它僅用於記錄目的,那麼您應該自己登錄傳遞到方法中的所有參數mthA

爲什麼mthB知道mthA的參數值來處理異常?如果你這樣做,那麼你應該考慮重構代碼並處理適當級別的異常。如果傳遞給mthA的值導致異常,則應在調用mthB之前在其中處理該值。

反射僅有助於獲取類和方法的靜態信息,並且不會提供傳遞給方法的參數的運行時值。

+0

mthB必須重新執行methA因此mthB應該知道哪些參數傳遞給methA。在我的情況下,如果mthA失敗,那麼我只需要重新執行該方法(休眠時間之後)再解決它。因此我需要知道傳遞給mthA的參數並重新執行它。 – 2013-05-13 05:17:13

0

爲什麼不使用AspectJ之類的AOP工具來捕獲這些值和日誌?你可以使用execution()指針和after()通知。對於非生產部署,您可以記錄所有方法調用以及傳遞的值和返回值。這對於生產環境來說將會是太多的開銷。爲此,您可以將傳遞的值(AspectJ建議中的Object args [])存儲在局部變量中,並且只在發生異常時才記錄它。但即使在這種情況下,會有一些性能損失,因爲原始值將被裝箱以作爲Object []傳遞給您的建議。

+0

嗨@Amolü我在AspectJ上搜索了一下。我想我可以使用那個東西。但是你能否指出一些很好理解的例子。無論我在哪裏搜索,我都發現AspectJ可以與Springs框架一起使用。但我不使用Spring框架。我的是一個硒webdriver框架。你能否在這方面指出一些例子。 – 2013-08-23 05:45:54