類加載機制
類加載機制
敘述:類加載機制就是將.class文件加載到JVM,并形成class對象的機制。之后就可以對其實例化并使用,這個機制可以動態的加載外部的類、遠程下載的class文件,并且可以做到類之間的隔離。
步驟:JVM加載的步驟:裝載、鏈接、初始化。
裝載:將class文件中的字節碼加載到JVM,并通過全名(org.test.Test)和類加載器(ClassLoader)來加載到JVM中。
鏈接:負責對裝載的二進制字節碼的格式進行檢驗,初始化類中的靜態標量并檢查類中調用的接口、類。最后對所有的屬性、方法進行檢驗。
初始化:初始化是執行靜態初始化代碼、構造器代碼和靜態屬性的初始化
出發的方式:1.new 2.反射 3.子類調用初始化 4.JVM啟動參數中的類
ClassLoader:有4種ClassLoader負責加載類。
1.Bootstrap ClassLoader
由C++實現的,來加載jre/lib/rt.jar、resources.jar等。在java中無法拿到此對象。
2.Extension ClassLoader
用來加載java擴展包,jre/lib/ext/*.jar。
3.System ClassLoader
用來加載參數中的指定的classpath的jar,在類中顯示對應的是AppClassLoader。
4.User-Defined ClassLoad
是java開發人員繼承ClassLoader抽象類自行實現的ClassLoader,可以加載非classpath中的類(網絡下載的java、class),還可以在加載之前做一些事情。
加載順序:
首先要說明一個誤區,這個誤區是經常理解有問題的。
classloader加載的只是class(類),不要認為它加載的是對象,這樣你就會很是理解不了classloader加載順序。
classloader的順序是先父后子(這里因為Bootstrap ClassLoader在java中拿不到,所以他是最先完成加載的)
已委托的方式循序加載
例如:User-Defined ClassLoad有個一類要加載則先會去委托System ClassLoader加載依此類推,每個節點都會委托父節點去加載,
如果父節點沒有加載到自己再去加載,如果父節點加載了將吧加載的引用返回給自己。
兩個java類相同的條件不盡需要同樣的包名和class而且加載器也必須相同,這樣的類才算是統一各類。比如有classloaderA和classloaderB,都加在了
Test類,兩次別加載的類是不一樣的。這也體現出了隔離性。
posted on 2012-03-27 15:16 海峰 閱讀(148) 評論(0) 編輯 收藏 所屬分類: JVM理解