關於Java如何加載類,能夠參考下面這篇文章:
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/
這裏咱們來了解下,各種ClassLoader是從哪些地方去尋找class類文件進行加載的?
JVM是經過一個稱爲ClassLoader東西來加載Class文件的,每當JVM啓動,它就會生成三個ClassLoader,它們分別是Bootstrap Loader, ExtClassLoader 和AppClassLoader。
這三個ClassLoader做用是不一樣的,它們所加載的class文件也是不一樣的。
java
Bootstrap Loader是用C++語言實現的,它所加載的是JVM中最底層的類,它加載時的搜索路徑是由sun.boot.class.path所指定的。spa
Java代碼
ssl
System.out.println(System.getProperty("sun.boot.class.path")); get
輸出結果以下:
E:\Program Files\Java\jdk1.6.0_31\jre\lib\resources.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\lib\rt.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\lib\sunrsasign.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\lib\jsse.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\lib\jce.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\lib\charsets.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\lib\modules\jdk.boot.jar;
E:\Program Files\Java\jdk1.6.0_31\jre\classes
ExtClassLoader是用來加載java的一些庫的,它加載時的搜索路徑是由java.ext.dirs來決定的,該加載器在加載時不一樣於其餘加載器,它加載時會搜索指定路徑下的全部子目錄,也就是說它會搜索java.ext.dirs所指定下的全部子目錄下的class文件或jar文件。同時也能夠用參數-Djava.ext.dirs來改變它的搜索路徑。class
Java代碼
module
System.out.println(System.getProperty("java.ext.dirs")); jdk
輸出結果以下:
E:\Program Files\Java\jdk1.6.0_31\jre\lib\ext;
C:\Windows\Sun\Java\lib\ext
AppClassLoader也稱System ClassLoader, 它的搜索路徑是由java.class.path來指定的,並且要注意AppClassLoader不會搜索java.class.path下的子目錄的。搜索
Java代碼
rsa
System.out.println(System.getProperty("java.class.path")); 程序
輸出結果以下:
D:\workspace_dbm\study\bin;
D:\workspace_dbm\study\lib\common-sdl-1.1.1-TAG20120213-SNAPSHOT.jar;
D:\workspace_dbm\study\lib\commons-logging-1.1.1.jar;
D:\workspace_dbm\study\lib\commons-lang-2.6.jar;
D:\workspace_dbm\study\lib\tools.jar
ExtClassLoader 和AppClassLoader在JVM中只會存在一個實例,一旦運行了是沒法改變它們的搜索路徑的,也就是沒法在程序中經過調用System.setProperty()來改變java.class.path或java.ext.dirs來改變它們的搜索路徑的。