簡體   English   中英

使用 Throwable 獲取類名

[英]get class name using Throwable

為什么這段代碼允許獲取類名?

我用靜態方法聲明了一個類(不需要是靜態的順便說一句)

class JavaSample {
    public static String getClassName() {
        final Throwable t = new Throwable();
        t.fillInStackTrace();
        final String clazz = t.getStackTrace()[1].getClassName();
        return clazz;
    }
}

如果我然后寫

public class HelloWorld{
     public static void main(String []args){
        System.out.println(JavaSample.getClassName());
     }
}

它返回HelloWorld類名。 但如果我喜歡這個

public class HelloWorld{
     public static void main(String []args){
        final Throwable t = new Throwable();
        t.fillInStackTrace();
        final String clazz = t.getStackTrace()[1].getClassName();
        System.out.println(clazz);
     }
}

它在t.getStackTrace()[1]行中拋出ArrayIndexOutOfBoundsException

為什么它在我使用Throwable時返回 classname ?

第一個版本有效,因為t.getStackTrace()返回一個數組,其中第一個元素(元素 0)是當前方法( JavaSample.getClassName ),第二個元素(元素 1)是調用者( HelloWorld.main )。 在第二個版本中,您沒有調用者,並且堆棧跟蹤僅包含一個元素(元素 0),因此在引用不存在的元素 1 時會出現異常。

沒有必要創建一個Throwable來獲取堆棧跟蹤。 您可以通過調用Thread.currentThread().getStackTrace()來獲取它。

在第一種情況下,堆棧跟蹤包含函數 getClassName() 和 main()。 在第二種情況下,只有 main(),因此堆棧跟蹤只包含一個條目,而 t.getStackTrace()[1] 會引發錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM