天天看點

在Java靜态方法中擷取目前類名

​​​​

靜态方法不與特定執行個體關聯,不能引用this,要得到目前類名,沒有直接的辦法。

通過查資料和試驗,可以用下面幾種方式:

1  public static void testGetClassName()
 2      {
 3          // 方法1:通過SecurityManager的保護方法getClassContext()
 4          String clazzName = new SecurityManager()
 5          {
 6              public String getClassName()
 7              {
 8                  return getClassContext()[1].getName();
 9              }
10          }.getClassName();
11          System.out.println(clazzName);
12          // 方法2:通過Throwable的方法getStackTrace()
13          String clazzName2 = new Throwable().getStackTrace()[1].getClassName();
14          System.out.println(clazzName2);
15          // 方法3:通過分析匿名類名稱()
16          String clazzName3 = new Object()    {
17              public String getClassName()
18              {
19                  String clazzName = this.getClass().getName();
20                  return clazzName.substring(0, clazzName.lastIndexOf('$'));
21              }
22          }.getClassName();
23          System.out.println(clazzName3);
24      }      

分别調用10萬次,

    方法1:219ms

    方法2:953ms

    方法3:31ms

比較:

    1)方法1不知有沒有什麼使用限制?

    2)方法2通過異常機制擷取調用棧,性能最差,但能提供其它方法所不具有的功能,還可以擷取方法名,行号等等;但這麼使用多少有點不太正常;

    3)方法3隻是簡單分析了一下匿名類的名稱,顯然要簡單多,事實上性能也是最高的;

更換部落格釋出位址:​​http://ihongqiqu.com​​

繼續閱讀