2009-04-22 53 views
20

我認爲這是每個Java程序員遇到的情況,如果他們做了足夠長的時間。您正在進行一些調試並對課程進行更改。當你重新運行這個程序時,這些改變似乎沒有被提起,而是舊的類似乎仍在運行。你清理並重建一切,同樣的問題。有時候,這可能會歸結爲一個類路徑問題,類路徑中的同一類不止一次,但似乎沒有一種簡單的方法可以找出正在加載的類的來源...在文件系統上,我的Java類是從哪裏加載的?

有什麼方法可以找到加載類的文件路徑?如果從.class文件或.jar文件中加載該類,那麼最好能起作用。有任何想法嗎?

+0

這與以下問題幾乎相同,後者的答案略有不同:http://stackoverflow.com/questions/947182/how-to-explore-which-classes-are-loaded-from-which-jars – 2012-08-07 05:42:27

回答

26

只需使用標準命令行開關「-verbose:class」(請參閱​​the java documentation)運行java。每次加載課程時都會打印出來,並告訴你它從哪裏加載。

+0

實際上,任何JVM,因爲-verbose是必需的標誌,不是。這是與供應商有關的-X標誌。 – 2009-04-23 03:40:41

+0

謝謝,我提到過。 – 2009-04-23 07:39:10

13

如果你想從內部應用程序編程做到這一點,請嘗試:

URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); 

(注意,getCodeSource()可能返回null,所以實際上並沒有這一切在同一行:))

+0

getProtectionDomain也可能返回null(通常用於引導類)。我的問題是,如果更改沒有顯示出來,您如何運行此代碼? :) – 2009-04-22 23:31:01

0

由於課程需要來自課程路徑中的某個地方,因此我建議您只需print the class path並檢查某個地方是否有舊版本的課程。

5
public static URL getClassURL(Class klass) { 
    String name = klass.getName(); 
    name = "/" + convertClassToPath(name); 
    URL url = klass.getResource(name); 
    return url; 
} 

public static String convertClassToPath(String className) { 
    String path = className.replaceAll("\\.", "/") + ".class"; 
    return path; 
} 

只要將它粘在某個地方,並將它傳遞給想要查找其定義的類的Class對象。它應該工作,無論它從哪裏調用,因爲它會在要搜索的類上調用getResource()。

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

輸出示例: 的jar:文件:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar /java/lang/String.class

相關問題