最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM類加載機(jī)制詳解

 更新時(shí)間:2017年02月20日 08:36:30   作者:王中秋  
本文主要介紹了JVM類加載機(jī)制的相關(guān)知識(shí),具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

一、先看看編寫(xiě)出的代碼的執(zhí)行過(guò)程:

二、研究類加載機(jī)制的意義

從上圖可以看出,類加載是Java程序運(yùn)行的第一步,研究類的加載有助于了解JVM執(zhí)行過(guò)程,并指導(dǎo)開(kāi)發(fā)者采取更有效的措施配合程序執(zhí)行。

研究類加載機(jī)制的第二個(gè)目的是讓程序能動(dòng)態(tài)的控制類加載,比如熱部署等,提高程序的靈活性和適應(yīng)性。

三、類加載的一般過(guò)程

原理:雙親委托模式

1、尋找jre目錄,尋找jvm.dll,并初始化JVM;

2、產(chǎn)生一個(gè)Bootstrap Loader(啟動(dòng)類加載器);

3、Bootstrap Loader自動(dòng)加載Extended Loader(標(biāo)準(zhǔn)擴(kuò)展類加載器),并將其父Loader設(shè)為Bootstrap Loader。

4、Bootstrap Loader自動(dòng)加載AppClass Loader(系統(tǒng)類加載器),并將其父Loader設(shè)為Extended Loader。

5、最后由AppClass Loader加載HelloWorld類。

四、類加載器的特點(diǎn)

1、運(yùn)行一個(gè)程序時(shí),總是由AppClass Loader(系統(tǒng)類加載器)開(kāi)始加載指定的類。

2、在加載類時(shí),每個(gè)類加載器會(huì)將加載任務(wù)上交給其父,如果其父找不到,再由自己去加載。

3、Bootstrap Loader(啟動(dòng)類加載器)是最頂級(jí)的類加載器了,其父加載器為null.

五、類加載器的獲取

很容易,看下面例子

public class HelloWorld { 
   public static void main(String[] args) { 
     HelloWorld hello = new HelloWorld(); 
     Class c = hello.getClass(); 
     ClassLoader loader = c.getClassLoader(); 
     System.out.println(loader); 
     System.out.println(loader.getParent()); 
     System.out.println(loader.getParent().getParent()); 
   } 
}

打印結(jié)果:

sun.misc.Launcher$AppClassLoader@19821f 
sun.misc.Launcher$ExtClassLoader@addbf1 
null 

從上面的結(jié)果可以看出,并沒(méi)有獲取到ExtClassLoader的父Loader,原因是Bootstrap Loader(啟動(dòng)類加載器)是用C語(yǔ)言實(shí)現(xiàn)的,找不到一個(gè)確定的返回父Loader的方式,于是就返回null。 

六、類的加載

類加載有三種方式:

1、命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載

2、通過(guò)Class.forName()方法動(dòng)態(tài)加載

3、通過(guò)ClassLoader.loadClass()方法動(dòng)態(tài)加載

三種方式區(qū)別比較大,看個(gè)例子就明白了:

package zhongqiu.common.base;
public class ClassLoadDemo {
 static {
 System.out.println("ClassLoadDemo靜態(tài)初始化塊執(zhí)行了!");
 }
 public static void main(String[] args) throws ClassNotFoundException {
 ClassLoader loader2 = ClassLoadDemo.class.getClassLoader();
 System.out.println(loader2);
 // 使用ClassLoader.loadClass()來(lái)加載類,不會(huì)執(zhí)行初始化塊
 // loader2.loadClass("zhongqiu.test.Test");
 // 使用Class.forName()來(lái)加載類,默認(rèn)會(huì)執(zhí)行初始化塊
 // Class.forName("zhongqiu.test.Test");
 // 使用Class.forName()來(lái)加載類,并指定ClassLoader,初始化時(shí)不執(zhí)行靜態(tài)塊
 Class.forName("zhongqiu.test.Test", false, loader2);
 }
}

七、自定義ClassLoader

package zhongqiu.common.base.classload; 
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader {
 @SuppressWarnings("resource")
 public static void main(String[] args)
  throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
 URL url = new URL("file:/D:/javaworkspace/JavaCommon/src/");
 ClassLoader myloader = new URLClassLoader(new URL[] { url });
 Class c = myloader.loadClass("zhongqiu.common.base.classload.Test");
 Test t3 = (Test) c.newInstance();
 }
}

Java.lang包里有個(gè)ClassLoader類,ClassLoader 的基本目標(biāo)是對(duì)類的請(qǐng)求提供服務(wù),按需動(dòng)態(tài)裝載類和資源,只有當(dāng)一個(gè)類要使用(使用new 關(guān)鍵字來(lái)實(shí)例化一個(gè)類)的時(shí)候,類加載器才會(huì)加載這個(gè)類并初始化。一個(gè)Java應(yīng)用程序可以使用不同類型的類加載器。例如Web Application Server中,Servlet的加載使用開(kāi)發(fā)商自定義的類加載器, java.lang.String在使用JVM系統(tǒng)加載器,Bootstrap Class Loader,開(kāi)發(fā)商定義的其他類則由AppClassLoader加載。在JVM里由類名和類加載器區(qū)別不同的Java類型。因此,JVM允許我們使用不同的加載器加載相同namespace的java類,而實(shí)際上這些相同namespace的java類可以是完全不同的類。這種機(jī)制可以保證JDK自帶的java.lang.String是唯一的。

八、為什么要使用這種雙親委托模式呢?

因?yàn)檫@樣可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時(shí)候,就沒(méi)有必要子ClassLoader再加載一次。

考慮到安全因素,我們?cè)囅胍幌拢绻皇褂眠@種委托模式,那我們就可以隨時(shí)使用自定義的String來(lái)動(dòng)態(tài)替代java核心api中定義類型,這樣會(huì)存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因?yàn)镾tring已經(jīng)在啟動(dòng)時(shí)被加載,所以用戶自定義類是無(wú)法加載一個(gè)自定義的ClassLoader。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 解決

    解決"XML Parser Error on line 1: 前言中不允許有內(nèi)容"錯(cuò)誤

    解決用windows自帶的記事編輯xml文件后出現(xiàn) "XML Parser Error on line 1: 前言中不允許有內(nèi)容。"的錯(cuò)誤
    2018-02-02
  • Java中的runnable 和 callable 區(qū)別解析

    Java中的runnable 和 callable 區(qū)別解析

    Runnable接口用于定義不需要返回結(jié)果的任務(wù),而Callable接口可以返回結(jié)果并拋出異常,通常與Future結(jié)合使用,Runnable適用于簡(jiǎn)單的后臺(tái)任務(wù)和定時(shí)任務(wù),而Callable適用于并行計(jì)算、異步操作和復(fù)雜任務(wù),選擇使用哪個(gè)接口取決于具體的應(yīng)用場(chǎng)景,感興趣的朋友一起看看吧
    2025-03-03
  • 解讀jdk動(dòng)態(tài)代理為什么必須實(shí)現(xiàn)接口

    解讀jdk動(dòng)態(tài)代理為什么必須實(shí)現(xiàn)接口

    這篇文章主要介紹了解讀jdk動(dòng)態(tài)代理為什么必須實(shí)現(xiàn)接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 線程池ThreadPoolExecutor使用簡(jiǎn)介與方法實(shí)例

    線程池ThreadPoolExecutor使用簡(jiǎn)介與方法實(shí)例

    今天小編就為大家分享一篇關(guān)于線程池ThreadPoolExecutor使用簡(jiǎn)介與方法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Java類的初始化順序知識(shí)點(diǎn)總結(jié)

    Java類的初始化順序知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Java類的初始化順序知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Spring運(yùn)行環(huán)境Environment的解析

    Spring運(yùn)行環(huán)境Environment的解析

    本文主要介紹了Spring運(yùn)行環(huán)境Environment的解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 聊聊Spring Boot 如何集成多個(gè) Kafka

    聊聊Spring Boot 如何集成多個(gè) Kafka

    這篇文章主要介紹了Spring Boot 集成多個(gè) Kafka的相關(guān)資料,包括配置文件,生成者和消費(fèi)者配置過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • 深入淺析springsecurity入門登錄授權(quán)

    深入淺析springsecurity入門登錄授權(quán)

    SpringSecurity為我們提供了基于注解的權(quán)限控制方案,這也是我們項(xiàng)目中主要采用的方式,我們可以使用注解去指定訪問(wèn)對(duì)應(yīng)的資源所需的權(quán)限,這篇文章主要介紹了springsecurity入門登錄授權(quán),需要的朋友可以參考下
    2024-05-05
  • Java設(shè)計(jì)模式七大原則之接口隔離原則詳解

    Java設(shè)計(jì)模式七大原則之接口隔離原則詳解

    接口隔離原則(Interface Segregation Principle),又稱為ISP原則,就是在一個(gè)類中不要定義過(guò)多的方法,接口應(yīng)該盡量簡(jiǎn)單細(xì)化。本文將為大家具體介紹一下Java設(shè)計(jì)模式七大原則之一的接口隔離原則,需要的可以參考一下
    2022-02-02
  • Java 全面系統(tǒng)介紹反射的運(yùn)用

    Java 全面系統(tǒng)介紹反射的運(yùn)用

    準(zhǔn)備入手學(xué)習(xí)java的安全了,感覺(jué)這也是一個(gè)大的趨勢(shì),想著盡早進(jìn)入到j(luò)ava安全的探索中,在反序列化鏈的學(xué)習(xí)之前,需要先學(xué)習(xí)反射,不多說(shuō)了,開(kāi)干吧
    2022-03-03

最新評(píng)論

延津县| 葵青区| 沂水县| 法库县| 卢龙县| 高青县| 岢岚县| 贺州市| 卢湾区| 潮安县| 宣城市| 昭苏县| 大竹县| 中卫市| 扬中市| 兰考县| 鹤岗市| 杨浦区| 正阳县| 龙川县| 长宁区| 九台市| 辽阳县| 沭阳县| 杨浦区| 舒兰市| 奈曼旗| 怀安县| 精河县| 镇雄县| 深圳市| 临夏县| 五寨县| 鸡泽县| 横山县| 天水市| 白沙| 白朗县| 英吉沙县| 贵溪市| 云林县|