2012-03-15 87 views
56

我正在處理一個項目,一個要求是如果主方法的第二個參數以'/'開頭(對於linux),它應該將其視爲絕對路徑(而不是問題) ,但如果它不以'/'開始,它應該獲得該類的當前工作路徑並將它附加給給定的參數。獲取當前類的名稱,包括包

我可以通過多種方式獲取類名稱:System.getProperty("java.class.path")new File(".")getCanonicalPath(),等等..

的問題是,這只是讓我在其中封裝的存儲目錄 - 也就是說,如果我有一個存儲在「.../project/this/is/package/name」中的類,它只會給我「/ project /」,並忽略實際的.class文件所在的包名。

有什麼建議嗎?

編輯: 這裏的解釋,從鍛鍊說明採取

sourcedir可以是絕對路徑(以「/」)或相對的地方,我們從

sourcedir運行程序是主要方法的一個給定的論證。我怎麼能找到那條路?

+2

如果代碼打包在JAR中(或者不在您所假設的文件夾/文件結構中),您將執行什麼操作?這是一個危險的假設;這對於一個小實驗,班級任務或其他一次性情況來說可能工作得很好,但是請不要養成對生產質量代碼做出這種假設的習慣。 – 2012-03-15 22:56:15

+0

找到類文件的路徑是沒有意義的。另外練習描述並沒有提到如果你仔細閱讀(*我們從*運行程序的地方意味着程序被用戶調用的當前路徑)。 – 2012-03-15 23:15:20

+0

也許你可以幫助我更好地理解要求?我需要檢查參數以'/'開始(在描述中提及)。如果是這樣,就把它當作絕對的。原樣。但如果沒有,我該如何對待它? – 2012-03-15 23:18:43

回答

112

使用this.getClass().getCanonicalName()可以獲得完整的課程名稱。

請注意,包/類名(「abC」)與.class文件(a/b/C.class)的路徑不同,並且使用包名/類名來派生路徑是通常不好的做法。類文件/包的集合可以位於多個不同的類路徑中,這些路徑可以是目錄或jar文件。

+0

謝謝,但它在主要方法中,'this'不能用於靜態方法。任何解決它的方法? – 2012-03-15 22:41:33

+0

http://stackoverflow.com/questions/936684/getting-the-class-name-from-a-static-method-in-java – 2012-03-15 22:44:12

+0

編輯了這個問題。以更好地解釋 – 2012-03-15 23:09:48

16

有一類,Class,可以做到這一點:

Class c = Class.forName("MyClass"); // if you want to specify a class 
Class c = this.getClass();   // if you want to use the current class 

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName()); 

如果c代表了包mypackageMyClass,上面的代碼將打印:

套餐:mypackage的
類別:MyClass
完整標識符:mypackage.MyClass

您可以獲取此信息並根據需要對其進行修改,或者轉至check the API以獲取更多信息。

+0

請注意,Class.forName(「MyClass」)只有在默認包中(即沒有包聲明)纔會起作用。 – 2012-03-15 22:46:00

+1

@TheNail true,'getName()'返回包名和類名,現在編輯。 – Jon 2012-03-15 22:47:01

+0

使用'getSimpleName()'獲取沒有包名稱的類名。 – 2012-03-15 22:48:32

6

完全限定名opbtained如下:

String fqn = YourClass.class.getName(); 

但是,你需要閱讀類路徑的資源。因此,使用

InputStream in = YourClass.getResourceAsStream("resource.txt");