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

如何理解和運用ClassLoader

 更新時間:2021年01月30日 14:47:20   作者:wsMrLin  
這篇文章主要介紹了如何理解和運用 ClassLoader,幫助大家更好的理解和使用JVM,感興趣的朋友可以了解下

定義

根據《深入理解Java虛擬機》提到“通過一個類的全限定名(packageName.ClassName)來獲取描述此類的二進制字節(jié)(class文件字節(jié))這個動作的代碼模塊就叫做類加載器(ClassLoader)”。

作用

1、通常類加載器的作用是加載資源(字節(jié)碼文件)到java虛擬機中,想要在一個jvm 進程中唯一確認一個類,除了類的全限定名外,還需要指定它是由哪個類加載器加載的。
2、比如我們的類庫需要通過遠程網絡獲取,可以通過自定義類加載器從遠程加載字節(jié)碼文件。
3、java的字節(jié)碼文件很容易反編譯出來,一些核心的代碼不想被反編譯出來,可以對字節(jié)碼進行加密,然后通過自定義的類加載器加載這些字節(jié)碼,然后進行解碼返回給虛擬機。
4、比如jvm的熱加載和熱部署等功能也需要自定義類加載器來完成。
.......

java類加載器的種類

1、Bootstrap ClassLoader : 該加載器是最頂層的類加載器,它是加載放在{Java_home}\lib目錄 或者-Xbootclasspath指定路徑下類庫。

2、Extension ClassLoader : 該類加載器負載加載{Java_home}/lib\ext目錄 或者System.getenv("java.ext.dirs")系統(tǒng)變量路徑下的類庫。

3、Application ClassLoader : 該類加載器加載用戶程序類路徑下的類庫,它是默認的程序的類加載器。

雙親委派機制

1、雙親委派機制,雙親委派除了啟動類加載器(Bootstrap ClassLoader)外,其他的類加載器都應該有自己父加載器。它們的實現不是通過繼承來實現的,而是通過組合的方式。當加載某個Class時,當前類加載器會把這個加載請求委派給其父類加載器加載,同理父類加載器同樣委派其它的父類加載器加載,直到無其父類類加載器加載為止,如果父類加載器加載失敗,才會由其子類加載。

2、使用雙親委派機制,有個明顯的特征是:Java類隨著它的類加載器一起具備了一種優(yōu)先級的層次關系。比如rt.jar包中的java.lang.Object,由于它所在位置是由啟動類加載器加載,所以Object類在程序的各種類加載器環(huán)境中都是同一個類。

3、雙親委派模型如下:

ClassLoader

可以看下ClassLoader 雙親委派模型的大致代碼框架如下:

protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
  {
    synchronized (getClassLoadingLock(name)) {
      // 1、查看該類是否加載
      Class<?> c = findLoadedClass(name);
      if (c == null) {
        long t0 = System.nanoTime();
        try {
 		  // 2、如果未加載,委托給父類加載器加載
          if (parent != null) {
            c = parent.loadClass(name, false);
          } else {
          //3、沒有父類加載器,委托給BootstrapClassLoader
            c = findBootstrapClassOrNull(name);
          }
        } catch (ClassNotFoundException e) {
          // ClassNotFoundException thrown if class not found
          // from the non-null parent class loader
        }

        if (c == null) {
          // 父類加載器沒有加載到,則自己加載
          long t1 = System.nanoTime();
          c = findClass(name);

          // 記錄該類加載的狀態(tài)Stat. 
        sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
          sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
          sun.misc.PerfCounter.getFindClasses().increment();
        }
      }
 	  // resolve :true,需要對類進行鏈接(鏈接階段包括:準備,解析,初始化類)
      if (resolve) {
        resolveClass(c);
      }
      return c;
    }
  }

1、通過以上可以知道,我們可以繼承ClassLoader 來實現自己的類加載器,然后重寫findClass()方法,這些還是保存了雙親委派機制。
2、當我們重寫findClass()方法時,得到該類的字節(jié)碼后,需要調用defineClass()來放回Class<?>對象。

URLClassLoader

1、一般自定義的類加載器可以直接繼承該類,該類加載器通過添加url路徑來獲取類。
2、可以在其構造函數上URLClassLoader(URL[] urls, ClassLoader parent)直接進行添加其URL。
3、也可以通過addURL(URL)添加其URL。

自定義類加載器

1、首先假設main-project為我們自己編寫的工程,其依賴某一api:service-spi。而service-spi的實現有很多,project-spi-impl是其中的一個。
2、當main-project僅依賴service-spi,而project-spi-impl不在工程的類加載路徑下。所以需要自定義類加載器,從某個路徑下的jar加載進來。CoreClassLoader就是自定義的類加載器。
3、CoreClassLoader繼承自URLClassLoader,然后把相關搜索路徑添加到該類加載器即可。
4.github:https://github.com/zhvqee/class-loader

SpringBoot 對類加載器的運用

1、SpringBoot 工程通過spring-boot-maven-plugin插件打包。把相關資源和依賴包都打到一個jar包中(all in one)。其包的結構如下:

BOOT-INF/classes:存放的是本工程的class文件
BOOT-INF/lib:存放的是本工程依賴的二方包和三方包。
META-INF/MANIFEST.MF:該文件記錄了程序啟動入口等。
o.s.b.loader包下就是springboot自定義的類加載器。

2、當我們執(zhí)行java -jar xxxx 時,會讀取MANIFEST.MF下
Main-Class: org.springframework.boot.loader.JarLauncher,
該配置就是程序的路口。而我們編寫的Main方法不是真正的啟動的入口。

3、當執(zhí)行Launcher#launch()方法時,會把SpringBoot自定義的類加載器LaunchedURLClassLoader設置線程的上下文中,并通過該自定義類加載器加載我們自己編寫的main方法所在的類,然后利用反射調用main方法。代碼片段如下:

Class<?> mainClass = Thread.currentThread().getContextClassLoader().loadClass(this.mainClassName);
Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
mainMethod.invoke(null, new Object[] { this.args });

4、LaunchedURLClassLoader 類加載器繼承URLClassLoader類加載器,它加載的路徑就是可執(zhí)行jar下BOOT-INF下的class文件和二方包、三方包。

Class.forName() 和 ClassLoader.load()

1、JVM 加載的類主要經過以下幾個步驟:加載,鏈接,初始化,試用,卸載。
2、Class.forName()默認是需要對加載的類進行初始化。
3、ClassLoader.load實際調用的是ClassLoader.load(className,false),false:表示不進行鏈接,不進行鏈接也就代表不會進行初始化的操作,類的靜態(tài)塊和靜態(tài)對象都不會執(zhí)行。

以上就是如何理解和運用ClassLoader的詳細內容,更多關于理解和運用 ClassLoader的資料請關注腳本之家其它相關文章!

相關文章

  • 老生常談spring boot 1.5.4 日志管理(必看篇)

    老生常談spring boot 1.5.4 日志管理(必看篇)

    下面小編就為大家?guī)硪黄仙U剆pring boot 1.5.4 日志管理(必看篇)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java 高并發(fā)一:前言

    Java 高并發(fā)一:前言

    本系列基于煉數成金課程,為了更好的學習,做了系列的記錄。 本文主要介紹 1.高并發(fā)的概念,為以后系列知識做鋪墊。 2.兩個重要的定理
    2016-09-09
  • Spring中property-placeholder的使用與解析詳解

    Spring中property-placeholder的使用與解析詳解

    本篇文章主要介紹了Spring中property-placeholder的使用與解析詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringBoot中@EnableAsync和@Async注解的使用小結

    SpringBoot中@EnableAsync和@Async注解的使用小結

    在SpringBoot中,可以通過@EnableAsync注解來啟動異步方法調用的支持,通過@Async注解來標識異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來介紹一下,感興趣的可以了解一下
    2023-11-11
  • Java經典面試題匯總:Spring Boot

    Java經典面試題匯總:Spring Boot

    本篇總結的是Spring-Boot框架相關的面試題,后續(xù)會持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實習生或者已經工作的同行,如果發(fā)現錯誤還望大家多多包涵,不吝賜教,謝謝
    2021-07-07
  • springBoot使用openfeign來遠程調用的實現

    springBoot使用openfeign來遠程調用的實現

    這篇文章主要介紹了springBoot使用openfeign來遠程調用的實現方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java ArrayList擴容問題實例詳解

    Java ArrayList擴容問題實例詳解

    這篇文章主要介紹了Java ArrayList擴容問題實例詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java實現根據地址智能識別省市區(qū)縣

    Java實現根據地址智能識別省市區(qū)縣

    這篇文章主要為大家詳細介紹了如何編寫一個Java工具類,可以根據身份證地址或用戶輸入的地址,智能識別并提取出詳細的省市區(qū)縣信息,感興趣的小伙伴可以了解下
    2025-03-03
  • Java中HashMap的put過程詳解

    Java中HashMap的put過程詳解

    這篇文章主要介紹了Java中HashMap的put過程詳解,HashMap有4個構造器,其他構造器如果用戶沒有傳入initialCapacity?和loadFactor這兩個參數,會使用默認值一般如果new?HashMap()不傳值,需要的朋友可以參考下
    2023-07-07
  • 序列化版本號serialVersionUID的作用_動力節(jié)點Java學院整理

    序列化版本號serialVersionUID的作用_動力節(jié)點Java學院整理

    Java序列化是將一個對象編碼成一個字節(jié)流,反序列化將字節(jié)流編碼轉換成一個對象,這篇文章主要介紹了序列化版本號serialVersionUID的作用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論

新安县| 扶沟县| 射洪县| 景洪市| 太保市| 麻阳| 酉阳| 清涧县| 梧州市| 沧源| 新乡市| 科技| 垫江县| 锦州市| 宣威市| 皮山县| 丹东市| 承德市| 永宁县| 武平县| 平果县| 巍山| 孟村| 南宫市| 西宁市| 南华县| 揭东县| 鲁山县| 肥东县| 寿宁县| 江华| 乌什县| 水城县| 海宁市| 高青县| 蛟河市| 南投县| 宜川县| 东明县| 关岭| 修武县|