亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取當前正在執行的方法的名稱。

獲取當前正在執行的方法的名稱。

30秒到達戰場 2019-06-20 16:30:59
獲取當前正在執行的方法的名稱。有辦法在Java中獲取當前正在執行的方法的名稱嗎?
查看完整描述

3 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

Thread.currentThread().getStackTrace()通常包含調用它的方法,但也有一些缺陷(請參閱Javadoc):

在某些情況下,某些虛擬機可能從堆棧跟蹤中省略一個或多個堆棧幀。在極端情況下,如果虛擬機沒有有關此線程的堆棧跟蹤信息,則允許該方法返回一個零長度數組。


查看完整回答
反對 回復 2019-06-20
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

從技術上講這是可行的.。

String name = new Object(){}.getClass().getEnclosingMethod().getName();

但是,在編譯期間將創建一個新的匿名內部類(例如,YourClass$1.class)。因此,這將創建一個.class用于部署此技巧的每個方法的文件。此外,在運行時,每次調用都會創建一個未使用的對象實例。因此,這可能是一個可以接受的調試技巧,但它確實會帶來很大的開銷。

這個把戲的好處是getEncosingMethod()回報java.lang.reflect.Method可用于檢索方法的所有其他信息,包括注釋和參數名稱。這使得區分具有相同名稱的特定方法(方法重載)成為可能。

注意,根據getEnclosingMethod()這個技巧不應該拋出SecurityException應該使用相同的類加載器加載內部類。因此,即使存在安全管理器,也不需要檢查訪問條件。

它需要使用getEnclosingConstructor()建筑工人。在(命名)方法之外的塊期間,getEnclosingMethod()回報null.


查看完整回答
反對 回復 2019-06-20
?
達令說

TA貢獻1821條經驗 獲得超6個贊

完整的代碼將

/**
 * Get the method name for a depth in call stack. <br />
 * Utility function
 * @param depth depth in the call stack (0 means current method, 1 means call method, ...)
 * @return method name
 */public static String getMethodName(final int depth){
  final StackTraceElement[] ste = Thread.currentThread().getStackTrace();

  //System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
  // return ste[ste.length - depth].getMethodName();  //Wrong, fails for depth = 0
  return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky}

更多這個問題.


青色評論:

我使用JRE 6并給出了不正確的方法名。
如果我寫ste[2 + depth].getMethodName().

  • 0

    getStackTrace(),

  • 1

    getMethodName(int depth)

  • 2

    正在調用方法。

為了取回方法名,需要計算要應用的正確索引。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 1125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號