關於尋找class檔案原理——
建議大家在入門的時候在命令列視窗編譯和運行,不要藉助JCreator或者Eclipse等IDE去協助做那些事情。嘗試自己這樣做:
javac -classpath yourpath *.java
java -classpath yourpath *.class
也許很多人都能看懂,設定classpath的目的就是告訴編譯器去哪裡尋找你的class檔案. 不過至少筆者今日才弄懂JVM去查詢類的原理,編譯器載入類要依靠classloader, 而classloader有3個層級,從高到低分別是BootClassLoader(名字可能不準確) , ExtClassLoader, AppClassLoader.
這3個載入器分別對應著編譯器去尋找類檔案的優先順序別和不同的路徑:BootClassLoader對應jre/classes路徑,是編譯器最優先尋找class的地方
ExtClassLoader對應jre/lib/ext路徑,是編譯器次優先尋找class的地方
AppClassLoader對應當前路徑,所以也是編譯器預設找class的地方
其實大家可以自己寫個程式簡單的測試,對任何class,例如A,
調用new A().getClass().getClassLoader().toString() 列印出來就可以看到,把class檔案放在不同的路徑下再次執行,就會看到區別。特別注意的是如果列印出來是null就表示到了最進階BootClassLoader, 因為它是C++編寫的,不存在Java對應的類載入器的名字。
尋找的順序是一種向上迂迴的思想,即如果本層級找不到,就只能去本層級之上的找,不會向下尋找。不過似乎從Jdk1.4到Jdk1.6這一特點又有改變,沒有找到詳細資料。所以就不舉例子了。告訴大家設計這種體系的是Sun公司曾經的技術核心宮力先生,一個純種華人哦!^_^
這樣希望大家不至於迷惑為什麼總報錯找不到類檔案,不管是自己寫的還是匯入的第三方的jar檔案(J2ee中經常需要匯入的)。
上面的內容摘自http://www.java2000.net/p225,Java 學習雜談(一),感覺寫的很容易理解,拿過來整理一下