2010-10-25 75 views

回答

9

this.getClass()=當前類
this.getClass()。getPackage()=當前包
Class.getName()=類名
Package.getName()=包名稱的字符串的字符串

我相信你正在尋找Reflection API以獲得相當於自省(http://download.oracle.com/javase/tutorial/reflect/)。

4

@克里斯托弗的答案解決了類名的問題。

AFAIK,標準的Java類庫沒有提供直接的方法來獲取對象類的文件名。

如果類是用適當的「-g」選項設置編譯,你可以潛在得到的類文件名間接如下:

  • 中的類中的方法之一,創建異常對象。
  • 使用Throwable.getStackTrace()獲取異常的堆棧跟蹤信息。
  • 獲取當前方法的堆棧跟蹤元素,並使用StackTraceElement.getFilename()來獲取源文件名。

請注意,這可能很昂貴,並且不能保證文件名將被返回,或者它將成爲您期望的文件名。

+0

我一時舉不出我這個源,但我確實記得,如果你決定做這樣的事情(並且請保持它不在生產級代碼中),你可以通過使用本地異常(例如NullPointerException)來加速它,而不是簡單地構建你自己的,因爲native例外已被緩存(對原作者'部分)。 IE:try {Object o; o.toString(); } catch(NullPointerException e){}比嘗試更快{throw new Exception(「foo」)} catch(Exception e){} – cwallenpoole 2010-10-26 01:19:04

+1

這是行不通的。該異常需要以正常的方式實例化,以允許您捕獲當前上下文的堆棧跟蹤信息。不管你是簡單地構造它還是做一些事情來構建JVM構造都沒有什麼不同。 (事實上​​,我懷疑後者實際上會比較慢,因爲必須拋出異常並將其捕獲。) – 2010-10-26 02:16:05

3

你可以得到(不含包)包含類文件的文件夾:

SomeClass.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm(); 
1

您可以使用反射來瀏覽堆棧跟蹤:

new Throwable().getStackTrace()[1].getFileName() 
new Throwable().getStackTrace()[1].getClassName() 
new Throwable().getStackTrace()[1].getMethodName() 
new Throwable().getStackTrace()[1].getLineNumber() 
相關問題