电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java類加載器層次結(jié)構(gòu)原理解析

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

類加載器的層次結(jié)構(gòu):

引導(dǎo)類加載器(bootstrap class loader)

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

加載擴(kuò)展類和應(yīng)用程序類加載器,并指定它們的父類加載器。

擴(kuò)展類加載器(extensions class loader)

用來加載java的擴(kuò)展庫(JAVA_HOME/jre/lib/ext/*.jar,或java.ext.dirs路徑下的內(nèi)容)java虛擬機(jī)的實(shí)現(xiàn)會(huì)提供一個(gè)擴(kuò)展庫目錄。該類加載器在此目錄里面查找并加載java類。

有sun.miscLauncher$ExtClassLoader實(shí)現(xiàn),繼承自java.lang.ClassLoader

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

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

由sun.misc.Launcher$AppClassLoader實(shí)現(xiàn),繼承自java.lang.ClassLoader

自定義類加載器

開發(fā)人員可以通過繼承java.lang.ClassLoader類的方式實(shí)現(xiàn)自己的類加載器,以滿足一些特殊的需求。

說明:在java中由于類的加載采用的是雙親委托機(jī)制,上面幾種類加載器是父子關(guān)系,其中引導(dǎo)類加載器為基礎(chǔ)。

ClassLoader類介紹

作用:

java.lang.ClassLoader類的基本職責(zé)就是根據(jù)一個(gè)指定的類的名稱找到或者生成其對(duì)應(yīng)的字節(jié)代碼,然后從這些字節(jié)代碼中定義出一個(gè)java類,即java.lang.Class類的一個(gè)實(shí)例。

除此之外,ClassLoader還負(fù)責(zé)加載java應(yīng)用所需的資源文件,如圖像文件和配置文件等。

相關(guān)方法:

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

代碼測(cè)試類加載器:

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

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

類加載器的代理模式:

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

雙親委托機(jī)制:

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

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

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

雙親委托機(jī)制是代理模式的一種:

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

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

自定義類加載器的流程:

繼承:java.lang.ClassLoader

首先檢查請(qǐng)求的類型是否已經(jīng)被這個(gè)類裝載器裝載到命名空間中,如果已經(jīng)裝載,則返回

委派類將加載請(qǐng)求給父類加載器,如果父類加載器能夠完成,則返回父類加載器加載的Class實(shí)例

調(diào)用本類加載器的findClass()方法,師徒獲取對(duì)應(yīng)的字節(jié)碼,如果獲取得到,則調(diào)用defineClass()導(dǎo)入類型到方法區(qū);如果獲取不到對(duì)應(yīng)的字節(jié)碼或者其它原因失敗,則返回異常給loadClass(),loadClass()轉(zhuǎn)拋異常,終止加載過程

注:被兩個(gè)加載器加載的同一個(gè)類,Jvm不認(rèn)為是相同的類。

示例代碼如下:

package com.test;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;/** * 自定義文件系統(tǒng)加載器 * @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 可以使用它將讀取的流數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組 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);//應(yīng)該先查詢有沒有加載過這個(gè)類。已經(jīng)加載,則直接返回加載好的類。 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; }}

測(cè)試代碼:

package com.test;/** * 測(cè)試自定義的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()); }}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | EPDM密封胶条-EPDM密封垫片-EPDM生产厂家 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 深圳市东信高科自动化设备有限公司| 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 南京欧陆电气股份有限公司-风力发电机官网 | 一级建造师培训_一建培训机构_中建云筑建造师培训网校 | 紧急切断阀_气动切断阀_不锈钢阀门_截止阀_球阀_蝶阀_闸阀-上海上兆阀门制造有限公司 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 航空铝型材,7系铝型材挤压,硬质阳*氧化-余润铝制品 | 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 悬浮拼装地板_篮球场木地板翻新_运动木地板价格-上海越禾运动地板厂家 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 |