ClassLoader小結

[size=medium]參考:聖思園視頻 和 http://topmanopensource.iteye.com/blog/667229

類加載機制:
創建自定義的類加載器,只需要擴展java.lang.ClassLoader類,然後[color=red]覆蓋它的findClass(String name)[/color]方法即可。該方法根據參數指定的類的名稱,返回它對應的Class對應的引用。

由java虛擬機自帶的類加載器所加載的類,在虛擬機的生命週期中,始終不會被卸載。java 虛擬機自帶的類加載器包括根類加載器,擴展類加載器,系統類加載器。java虛擬機本身會始終引用這些類加載器,而這些類加載器則會始終引用它們所加載的類的Class對象。

由用戶自定義的類加載器所加載的類是可以被卸載的。在類的加載器的內部實現中,用一個[color=red]java集合來存放所加載類的引用[/color]。另一方面,一個Class對象總是會引用它的類加載器。調用Class對象的方法。就能獲取它的類加載器。
一個類的實例總是引用代表這個類的Class對象(反射)。在Object類中定義了getClass()方法, 這個方法返回代表對象所屬類的Class對象的引用。此外所有的java類都有一個靜態屬性class,它引用代表這個類的class對象。

在父委託機制中,各個加載器按照父子關係形成了樹形結構。除了根類加載器以外其餘的類加載器都有且只有一個父加載器。
需要指出的是:
加載器之間的父子關係實質上指的是加載對象之間的包裝關係。而不是類之間的繼承關係。一對父子關係加載器可能是同一個加載類的兩個實例,也可能不是。在子加載器對象中包裝了一個父加載器對象。
父委託機制的優點:提供了軟件系統的安全性。因爲在此機制下,用戶自定義的類加載器不可能加載應該由父加載器加載的可靠類。從而防止不可靠的甚至惡意的代碼代替父加載器的可靠代碼。

調用ClassLoader類的loadClass方法加載一個類,並不是對類的主動使用,不會導致類的初始化。
在類的加載階段將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在[color=red]堆區創建一個java.lang.class對象,作爲方法區類對象的入口。[/color]

如以下代碼:
Class clazz = loader1.loadClass(“sample”);
Object object = clazz.newInstance();
在內存中的表示如下圖。

[img]http://dl.iteye.com/upload/attachment/0064/1775/001319fa-93b5-34fc-8113-429aae4351e4.jpg[/img][/size]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章