日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

類(lèi)加載器和類(lèi)加載機(jī)制

 gaoshenmu 2016-09-11


一個(gè)jvm進(jìn)程中的內(nèi)存和其他進(jìn)程之間不產(chǎn)生影響。
通常會(huì)有幾種情況使jvm停止,.eg:exit(); runtime 等

一.類(lèi)的加載:


當(dāng)一個(gè)類(lèi)加載到j(luò)vm內(nèi)存中需要通常是連續(xù)的3個(gè)步驟:

將class文件加載到內(nèi)存中, 并建立class 對(duì)象(java.lang.class )
是類(lèi)加載的本意和最終狀態(tài)。


1.加載:由類(lèi)加載器進(jìn)行加載,jvm提供類(lèi)加載器,也可以通過(guò)繼承classRoader實(shí)現(xiàn)自定義的類(lèi)加載器。

2.連接:生成對(duì)應(yīng)的class對(duì)象后就進(jìn)入連接狀態(tài) 把類(lèi)的二進(jìn)制數(shù)據(jù)加載到JRE中了。

(1).驗(yàn)證 加載類(lèi)是否有正確的結(jié)構(gòu)

(2).準(zhǔn)備:給類(lèi)的靜態(tài)Field分配內(nèi)存,初值

(3).解析:將類(lèi)的二進(jìn)制數(shù)據(jù)中符號(hào)應(yīng)用換成直接引用

3.初始化:正常的類(lèi)初始化,執(zhí)行順序。


二.類(lèi)加載器:


class 對(duì)象 的唯一標(biāo)識(shí):(類(lèi)名,包名,加載器名)

jvm 啟動(dòng)時(shí)會(huì)形成3層類(lèi)加載器結(jié)構(gòu):  

1:Bootstarp ClassLoader 根加載,當(dāng)執(zhí)行java.exe命令時(shí)會(huì) 加載java內(nèi)核不是Java.lang.ClassLoader的子類(lèi)。不是由java語(yǔ)言實(shí)現(xiàn)的。

2: Extension ClassLoader 擴(kuò)展類(lèi)加載器,負(fù)責(zé)加載JRE的擴(kuò)展目錄下的Class JAR包下的類(lèi)。

3: System ClassLoader 系統(tǒng)(應(yīng)用)類(lèi)加載器, jvm啟動(dòng)時(shí)加載classpath 路徑下的包和類(lèi)路徑。 自定義的加載器以類(lèi)加載器作為父加載器。

后兩者 e是s的父類(lèi)加載器,但沒(méi)有繼承關(guān)系。

系統(tǒng)類(lèi)加載器的實(shí)例是APPClassLoader,擴(kuò)展類(lèi)加載器的實(shí)例是ExtClassLoader。 這兩個(gè)類(lèi)都是URLClassLoader類(lèi)的實(shí)例。

三.類(lèi)加載的機(jī)制


1.全盤(pán)負(fù)責(zé): 一個(gè)類(lèi)加載器負(fù)責(zé)加載某個(gè)Class時(shí),該Class依賴(lài)的其他的class也由他加載,除非顯示指明由其他加載。
2.父類(lèi)委托:先讓父類(lèi)加載,如果父類(lèi)無(wú)法加載,才嘗試從自己的類(lèi)路徑中加載。當(dāng)父類(lèi)為null時(shí),JVM內(nèi)置的類(lèi)(稱(chēng)為:bootstrap class loader)就會(huì)充當(dāng)父類(lèi)。
3.緩存機(jī)制:先在緩存區(qū)中找,不存在才讀取轉(zhuǎn)換。

四.自定義類(lèi)加載器:


根據(jù)父類(lèi)委托,若父類(lèi)無(wú)法找到則調(diào)用當(dāng)前加載器找,繼承并重寫(xiě)classLoader中方法實(shí)現(xiàn)自定義類(lèi)加載器,

loadClass()和findclass()方法。
事實(shí)上,只重寫(xiě)findClass可以避免父類(lèi)委托和緩沖兩種機(jī)制的覆蓋。
同時(shí)該類(lèi)還有一些無(wú)法覆寫(xiě)的方法,eg:defineClass 該方法用于將將類(lèi)的字節(jié)碼文字寫(xiě)入到byte[]數(shù)組中,并轉(zhuǎn)化為class對(duì)象。

自定義加載器可以實(shí)現(xiàn)某些功能:eg:執(zhí)行前檢測(cè)簽名。其實(shí)通過(guò)XML文檔描述的配置信息最終都要變成Java類(lèi),實(shí)都是通過(guò)ClassLoader來(lái)完成的。

eg:

** * 一、ClassLoader加載類(lèi)的順序 * 1.調(diào)用 findLoadedClass(String) 來(lái)檢查是否已經(jīng)加載類(lèi)。 * 2.在父類(lèi)加載器上調(diào)用 loadClass 方法。如果父類(lèi)加載器為 null,則使用虛擬機(jī)的內(nèi)置類(lèi)加載器。 * 3.調(diào)用 findClass(String) 方法查找類(lèi)。 * 二、實(shí)現(xiàn)自己的類(lèi)加載器 * 1.獲取類(lèi)的class文件的字節(jié)數(shù)組 * 2.將字節(jié)數(shù)組轉(zhuǎn)換為Class類(lèi)的實(shí)例 * @author lei 2011-9-1 */ public class ClassLoaderTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { //新建一個(gè)類(lèi)加載器 MyClassLoader cl = new MyClassLoader('myClassLoader'); //加載類(lèi),得到Class對(duì)象 Class clazz = cl.loadClass('classloader.Animal'); //得到類(lèi)的實(shí)例 Animal animal=(Animal) clazz.newInstance(); animal.say(); } } class Animal{ public void say(){ System.out.println('hello world!'); } } class MyClassLoader extends ClassLoader { //類(lèi)加載器的名稱(chēng) private String name; //類(lèi)存放的路徑 private String path = 'E:\\workspace\\Algorithm\\src'; MyClassLoader(String name) { this.name = name; } MyClassLoader(ClassLoader parent, String name) { super(parent); this.name = name; } /** * 重寫(xiě)findClass方法 */ @Override public Class findClass(String name) { byte[] data = loadClassData(name); return this.defineClass(name, data, 0, data.length); } public byte[] loadClassData(String name) { try { name = name.replace('.', '//'); FileInputStream is = new FileInputStream(new File(path + name + '.class')); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b = 0; while ((b = is.read()) != -1) { baos.write(b); } return baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } return null; } }


五.URLClassLoader


URLClassLoader 是擴(kuò)展和系統(tǒng)類(lèi)加載器的父類(lèi)。是ClassLoader的子類(lèi)
作用:既可以本地獲取二進(jìn)制文件,也可以從遠(yuǎn)程主機(jī)獲取二進(jìn)制文件,構(gòu)造方法兩種:
1:默認(rèn)的父類(lèi)加載器創(chuàng)建一個(gè)classLoader ,并從urls指定的路徑獲取
2:使用指定父類(lèi)的加載器創(chuàng)建一個(gè)ClassLoader,得到URLClassLoader后就可調(diào)用loadClass 方法來(lái)加載指定的類(lèi)了。
用法:
URL url = file.toURI().toURL(); URLClassLoader loader = new URLClassLoader(new URL[] { url }); Class tidyClazz = loader.loadClass(所需class的含包名的全名);

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多