2011-02-28 1090 views
10

將當前正在執行的方法作爲Method對象獲得最優雅的方法是什麼?Java:獲取當前正在執行的Method對應對象

我的第一個明顯的方法是在助手類中使用靜態方法,該方法將加載當前線程堆棧,獲取正確的堆棧跟蹤元素,並從其信息構造Method元素。

有沒有更好的方法來實現這個目標?

+1

向下這是處理重載方法複雜的一面。我的建議是尋找另一種方法來做你想做的事情,而不用'Method'對象。即爲什麼你需要它? – 2011-02-28 09:12:26

+0

可能需要仔細查看一些需要執行此操作的日誌API的源代碼。其中一些項目已經存在了很長一段時間,並且應該有一些很好的解決方案來解決這個問題 – magicduncan 2011-02-28 09:18:29

+0

@Peter:你是對的,但我註釋了我需要找到的方法,所以不必擔心重載。實際上,動態地查找Method對象可以避免我的問題更糟糕的解決方案。 – glmxndr 2011-02-28 09:26:23

回答

2

開箱即用,我不知道有更好的方法來做到這一點。有一件事要考慮的可能是方面 - 你可以編寫一個方面到所有方法調用周圍的代碼中,並將當前的對象推送到ThreadLocal(基於來自連接點的反射信息)。

如果真的開槍所有的方法,但是這取決於你的結果做什麼,你可能能夠約束捕捉到某些包/班,這將有助於這將是可能過於昂貴。您也許能夠推遲Method的實際查找,直到它被使用,並且改爲存儲方法和參數的名稱等。

我懷疑是否會有一種特別便宜的方式實現這一點,但。

13

深入討論此主題in this SO Question

我需要做同樣的事情,我發現最好的解決方案是由@alexsmail提供的。

這似乎有點哈克但總的想法是,你在方法聲明局部類,然後採取從@ alexsmail的解決方案稍作修改class.getEnclosingMethod();

代碼的優勢:

public class SomeClass { 
    public void foo(){ 
     class Local {}; 
     Method m = Local.class.getEnclosingMethod(); 
    } 
} 
+6

另一個精簡版本可能是這樣的: new Object(){}。getClass().getEnclosingMethod() – 2015-06-10 18:08:53

相關問題