將當前正在執行的方法作爲Method對象獲得最優雅的方法是什麼?Java:獲取當前正在執行的Method對應對象
我的第一個明顯的方法是在助手類中使用靜態方法,該方法將加載當前線程堆棧,獲取正確的堆棧跟蹤元素,並從其信息構造Method元素。
有沒有更好的方法來實現這個目標?
將當前正在執行的方法作爲Method對象獲得最優雅的方法是什麼?Java:獲取當前正在執行的Method對應對象
我的第一個明顯的方法是在助手類中使用靜態方法,該方法將加載當前線程堆棧,獲取正確的堆棧跟蹤元素,並從其信息構造Method元素。
有沒有更好的方法來實現這個目標?
開箱即用,我不知道有更好的方法來做到這一點。有一件事要考慮的可能是方面 - 你可以編寫一個方面到所有方法調用周圍的代碼中,並將當前的對象推送到ThreadLocal(基於來自連接點的反射信息)。
如果真的開槍所有的方法,但是這取決於你的結果做什麼,你可能能夠約束捕捉到某些包/班,這將有助於這將是可能過於昂貴。您也許能夠推遲Method
的實際查找,直到它被使用,並且改爲存儲方法和參數的名稱等。
我懷疑是否會有一種特別便宜的方式實現這一點,但。
深入討論此主題in this SO Question。
我需要做同樣的事情,我發現最好的解決方案是由@alexsmail提供的。
這似乎有點哈克但總的想法是,你在方法聲明局部類,然後採取從@ alexsmail的解決方案稍作修改class.getEnclosingMethod();
代碼的優勢:
public class SomeClass {
public void foo(){
class Local {};
Method m = Local.class.getEnclosingMethod();
}
}
另一個精簡版本可能是這樣的: new Object(){}。getClass().getEnclosingMethod() – 2015-06-10 18:08:53
向下這是處理重載方法複雜的一面。我的建議是尋找另一種方法來做你想做的事情,而不用'Method'對象。即爲什麼你需要它? – 2011-02-28 09:12:26
可能需要仔細查看一些需要執行此操作的日誌API的源代碼。其中一些項目已經存在了很長一段時間,並且應該有一些很好的解決方案來解決這個問題 – magicduncan 2011-02-28 09:18:29
@Peter:你是對的,但我註釋了我需要找到的方法,所以不必擔心重載。實際上,動態地查找Method對象可以避免我的問題更糟糕的解決方案。 – glmxndr 2011-02-28 09:26:23