日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java類加載器層次結構原理解析

瀏覽:129日期:2022-08-30 09:51:52

類加載器的層次結構:

引導類加載器(bootstrap class loader)

用來加載java的核心庫(JAVA_HOME/jre/lib/rt.jar,或sun.boot.class.path路徑下的內容),是用原生代碼來實現的(C實現的),并不繼承自java.lang.ClassLoader。

加載擴展類和應用程序類加載器,并指定它們的父類加載器。

擴展類加載器(extensions class loader)

用來加載java的擴展庫(JAVA_HOME/jre/lib/ext/*.jar,或java.ext.dirs路徑下的內容)java虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄里面查找并加載java類。

有sun.miscLauncher$ExtClassLoader實現,繼承自java.lang.ClassLoader

應用程序類加載器(application class loader)

它根據java應用的類路徑(classpath,java.class.path路徑)來加載指定路徑的類,一般來說,java應用的類都是由它來完成加載的

由sun.misc.Launcher$AppClassLoader實現,繼承自java.lang.ClassLoader

自定義類加載器

開發人員可以通過繼承java.lang.ClassLoader類的方式實現自己的類加載器,以滿足一些特殊的需求。

說明:在java中由于類的加載采用的是雙親委托機制,上面幾種類加載器是父子關系,其中引導類加載器為基礎。

ClassLoader類介紹

作用:

java.lang.ClassLoader類的基本職責就是根據一個指定的類的名稱找到或者生成其對應的字節代碼,然后從這些字節代碼中定義出一個java類,即java.lang.Class類的一個實例。

除此之外,ClassLoader還負責加載java應用所需的資源文件,如圖像文件和配置文件等。

相關方法:

getParent()返回該類加載器的父類加載器 loadClass(String name)加載名稱為name的類,返回的結果是java.lang.Class類的實例 findClass(String name)查找名稱為name的類,返回的結果是java.lang.Class類的實例 findLoadedClass(String name)查找名稱為name的已經被加載過的類,返回的結果是java.lang.Class類的實例 defineClass(String name,byte[] b,int off,int len)把字節數組b中的內容轉換成java類,返回的結果是java.lang.Class類的實例。這個方法被聲明為final的。 resolveClass(Class<?> c)鏈接指定的java類。

代碼測試類加載器:

public class Demo02 { public static void main(String[] args) { System.out.println(ClassLoader.getSystemClassLoader()); System.out.println(ClassLoader.getSystemClassLoader().getParent());; System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());; }}

輸出:

sun.misc.Launcher$AppClassLoader@1016632

sun.misc.Launcher$ExtClassLoader@dc6a77

null

依次為應用加載器、擴展加載器和引導加載器(但是引導加載為原生代碼所寫,因此獲取不到,為null)。

類加載器的代理模式:

代理模式:交給其他加載器來加載指定的類。

雙親委托機制:

就是某個特定的類加載器在接到加載類的請求時,首先將加載任務委托給父類加載器,以此追溯,直到最高的爺爺輩的,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。

雙親委托機制是為了保證java核心庫的類型安全(這種機制就保證不會出現用戶自己能定義java.lang.Object類的情況)。

類加載器除了用于加載類,也是安全的最基本的屏障。

雙親委托機制是代理模式的一種:

并不是所有的類加載器都采用雙親委托機制。

tomcat服務器類加載器也使用代理模式,所不同的是它是首先嘗試自己去加載某個類,如果找不到再代理給父類加載器。這與一般類加載器的順序是相反的。

自定義類加載器的流程:

繼承:java.lang.ClassLoader

首先檢查請求的類型是否已經被這個類裝載器裝載到命名空間中,如果已經裝載,則返回

委派類將加載請求給父類加載器,如果父類加載器能夠完成,則返回父類加載器加載的Class實例

調用本類加載器的findClass()方法,師徒獲取對應的字節碼,如果獲取得到,則調用defineClass()導入類型到方法區;如果獲取不到對應的字節碼或者其它原因失敗,則返回異常給loadClass(),loadClass()轉拋異常,終止加載過程

注:被兩個加載器加載的同一個類,Jvm不認為是相同的類。

示例代碼如下:

package com.test;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;/** * 自定義文件系統加載器 * @author We.lxk * */public class FileSystemClassLoader extends ClassLoader{ private String rootDir; public FileSystemClassLoader(String rootDir) { this.rootDir = rootDir; } private byte[] getClassData(String classname){ //com.test.User -> rootDir/com/test/User String path = rootDir +'/'+classname.replace('.', '/')+'.class'; //IOUtils 可以使用它將讀取的流數據轉換為字節數組 InputStream is = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try{ is = new FileInputStream(path); byte[] buffer = new byte[1024]; int temp = 0; while((temp=is.read(buffer))!=-1){baos.write(buffer, 0, temp); } return baos.toByteArray(); }catch(Exception e){ e.printStackTrace(); return null; }finally{try { if(is!=null) is.close();} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();}try { if(baos!=null) baos.close();} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();} } } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { Class<?> c = findLoadedClass(name);//應該先查詢有沒有加載過這個類。已經加載,則直接返回加載好的類。 if(c!=null){ return c; }else{ ClassLoader parent = this.getParent(); try{//System.out.println('hello');c = parent.loadClass(name); //委派給父類加載 }catch(Exception e){//e.printStackTrace(); } if(c!=null){return c; }else{byte[] classData = getClassData(name);if(classData==null){ throw new ClassNotFoundException();}else{ c = defineClass(name, classData, 0, classData.length);} } } return c; }}

測試代碼:

package com.test;/** * 測試自定義的FileSystemClassLoader * @author We.lxk * */public class Demo03 { public static void main(String[] args) throws Exception { FileSystemClassLoader loader = new FileSystemClassLoader('D:/myJava'); FileSystemClassLoader loader2 = new FileSystemClassLoader('D:/myJava');Class<?> c = loader.loadClass('com.test.Demos'); Class<?> c2 = loader.loadClass('com.test.Demos'); Class<?> c3 = loader2.loadClass('com.test.Demos');Class<?> c4 = loader2.loadClass('java.lang.String'); Class<?> c5 = loader.loadClass('com.test.Demo'); System.out.println(c.hashCode()+' '+c.getClassLoader()); System.out.println(c2.hashCode()+' '+c2.getClassLoader()); System.out.println(c3.hashCode()+' '+c3.getClassLoader()); System.out.println(c4.hashCode()+' '+c4.getClassLoader()); System.out.println(c5.hashCode()+' '+c5.getClassLoader()); //System.out.println(.getClassLoader()); }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美91福利在线观看| 国内在线观看一区二区三区 | 麻豆高清免费国产一区| 视频一区日韩| 91亚洲无吗| 国产欧美二区| 里番精品3d一二三区| 精品国产亚洲日本| 免费福利视频一区二区三区| 福利在线免费视频| 精品在线91| 日韩在线观看中文字幕| 日韩av一区二区三区| 久久精品资源| 久久国产中文字幕| 免费在线观看视频一区| 亚洲一区二区三区无吗| 久久国产三级精品| 在线一区视频观看| 亚洲一区二区三区四区电影| 国产免费av国片精品草莓男男| 久久精品国产99国产精品| 亚洲精品88| 亚洲天堂免费| 亚洲无线一线二线三线区别av| 亚洲精品国产日韩| 午夜亚洲福利在线老司机| 福利一区二区| 国产videos久久| 老鸭窝毛片一区二区三区| 国产精选久久| 麻豆国产欧美日韩综合精品二区| 久久精品 人人爱| 色偷偷偷在线视频播放| 亚洲婷婷在线| 亚洲一区国产一区| 国产欧美一区二区三区米奇| 在线精品小视频| 国产另类在线| 亚洲手机视频| 一级欧美视频| 国产成人免费精品| 日韩国产在线观看一区| 国产成人精品福利| 91精品99| 国产a亚洲精品| 日韩不卡在线观看日韩不卡视频| 久久精品国产福利| 黄色亚洲大片免费在线观看| 国产精品免费精品自在线观看| 午夜欧美精品| 久久人人精品| 国产日韩欧美中文在线| 欧美jjzz| 国语精品一区| 日本免费一区二区视频| 99久久婷婷| 色综合五月天| 国产精东传媒成人av电影| 欧美视频一区| 日韩制服丝袜先锋影音| 老司机免费视频一区二区| 99视频一区| 99精品视频在线| 精品一区二区三区中文字幕视频| 91亚洲精品在看在线观看高清| 欧美va天堂| 99久久婷婷| 久久精品高清| 久久精品高清| 在线日韩中文| 日韩美女一区二区三区在线观看| 日韩精品欧美精品| 亚洲午夜久久| 视频一区二区中文字幕| 久久一区二区三区喷水| 久久精品女人| 国产日韩欧美一区二区三区| 国产三级一区| 国产精品麻豆久久| 亚洲黑丝一区二区| 婷婷亚洲精品| 国产图片一区| 久久久久九九精品影院| 精品国产a一区二区三区v免费| 久久精品99国产精品日本| 天堂精品久久久久| 亚洲综合精品| 国产精品va| 九九综合九九| 国产精品一页| 国内亚洲精品| 免费一级片91| 国产精品多人| 99久久激情| 欧美在线影院| 国产精品啊啊啊| 亚洲精品一二三区区别| 91精品日本| 激情婷婷综合| 国产精品色在线网站| 99精品综合| 欧美午夜网站| 欧美xxxx中国| 999久久久精品国产| 免费成人在线视频观看| 美女视频黄 久久| 宅男在线一区| 国产亚洲欧美日韩精品一区二区三区| 欧美精品91| 一区二区高清| 婷婷综合亚洲| 狠狠久久伊人中文字幕| 蜜臀久久99精品久久久久宅男| 国产精品入口久久| 亚洲专区一区| 日韩电影二区| 久久gogo国模啪啪裸体| 亚洲在线观看| 久久精品高清| 精品国产亚洲一区二区三区在线 | 亚洲专区视频| 日产精品一区二区| 日本大胆欧美人术艺术动态| 国产自产自拍视频在线观看| 欧美日韩一区二区三区四区在线观看| 婷婷综合在线| 亚洲韩日在线| 国模大尺度视频一区二区| 亚洲丝袜美腿一区| 欧美日韩国产亚洲一区| 亚洲福利免费| 中文在线а√在线8| 欧美伊人影院| 亚洲1区在线观看| 久久成人一区| 亚洲尤物在线| 国产亚洲在线| 国产伊人久久| 日韩成人在线看| 欧美影院视频| 福利一区二区免费视频| 国产日韩亚洲欧美精品| 一区二区国产精品| 性色av一区二区怡红| 欧美日韩激情在线一区二区三区| 国产a亚洲精品| 韩国久久久久久| 精品三级av在线导航| 国产伊人久久| 国产资源在线观看入口av| 久久久久免费av| 欧美日韩高清| 中文字幕乱码亚洲无线精品一区| 午夜欧美视频| 国产欧美一区二区色老头| 午夜久久av| 国产欧美午夜| 精品精品99| 日韩欧美自拍| 久久精品免费一区二区三区| 久久九九精品| 蜜臀av一区二区三区| 亚洲日本欧美| 精品久久免费| 日韩在线不卡| 蜜臀精品一区二区三区在线观看| 欧美日本三区| 精品色999| 国产丝袜一区| 综合激情在线| 影视先锋久久| 日韩免费小视频| 日韩高清二区| 国产精品黄网站| 91精品国产91久久久久久黑人| 亚洲在线电影| 国产suv精品一区| 久久久久国产精品一区二区| 性色一区二区| 久久精品观看| 久久激情五月激情| 亚洲va在线| 综合亚洲视频| 国产高清一区二区| 日本不良网站在线观看| 日韩欧美2区| 99国内精品| 成人高清一区| 日韩不卡一区二区三区 | 少妇精品久久久一区二区三区| 欧美日韩亚洲国产精品| 亚洲三级欧美| 欧美精品二区| 中文字幕av一区二区三区四区| 亚洲成人二区| 伊人久久av| 久久不见久久见免费视频7| 国产欧美精品久久| 在线视频精品|