我認爲這是每個Java程序員遇到的情況,如果他們做了足夠長的時間。您正在進行一些調試並對課程進行更改。當你重新運行這個程序時,這些改變似乎沒有被提起,而是舊的類似乎仍在運行。你清理並重建一切,同樣的問題。有時候,這可能會歸結爲一個類路徑問題,類路徑中的同一類不止一次,但似乎沒有一種簡單的方法可以找出正在加載的類的來源...在文件系統上,我的Java類是從哪裏加載的?
有什麼方法可以找到加載類的文件路徑?如果從.class
文件或.jar
文件中加載該類,那麼最好能起作用。有任何想法嗎?
我認爲這是每個Java程序員遇到的情況,如果他們做了足夠長的時間。您正在進行一些調試並對課程進行更改。當你重新運行這個程序時,這些改變似乎沒有被提起,而是舊的類似乎仍在運行。你清理並重建一切,同樣的問題。有時候,這可能會歸結爲一個類路徑問題,類路徑中的同一類不止一次,但似乎沒有一種簡單的方法可以找出正在加載的類的來源...在文件系統上,我的Java類是從哪裏加載的?
有什麼方法可以找到加載類的文件路徑?如果從.class
文件或.jar
文件中加載該類,那麼最好能起作用。有任何想法嗎?
只需使用標準命令行開關「-verbose:class
」(請參閱the java
documentation)運行java
。每次加載課程時都會打印出來,並告訴你它從哪裏加載。
實際上,任何JVM,因爲-verbose是必需的標誌,不是。這是與供應商有關的-X標誌。 – 2009-04-23 03:40:41
謝謝,我提到過。 – 2009-04-23 07:39:10
如果你想從內部應用程序編程做到這一點,請嘗試:
URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation();
(注意,getCodeSource()可能返回null,所以實際上並沒有這一切在同一行:))
getProtectionDomain也可能返回null(通常用於引導類)。我的問題是,如果更改沒有顯示出來,您如何運行此代碼? :) – 2009-04-22 23:31:01
由於課程需要來自課程路徑中的某個地方,因此我建議您只需print the class path並檢查某個地方是否有舊版本的課程。
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
這與以下問題幾乎相同,後者的答案略有不同:http://stackoverflow.com/questions/947182/how-to-explore-which-classes-are-loaded-from-which-jars – 2012-08-07 05:42:27