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

Java ClassLoader類加載器基礎(chǔ)詳解

 更新時(shí)間:2023年09月11日 17:30:01   作者:Tinyspot  
這篇文章主要為大家介紹了Java ClassLoader類加載器基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1. 類加載

  • JVM 首次使用某個(gè)類時(shí),需通過(guò) ClassPath 查找該類的 .class 文件
  • 將 .class 文件中對(duì)類的描述信息加載到內(nèi)存中,進(jìn)行保存
  • 加載時(shí)機(jī)
    • 創(chuàng)建對(duì)象
    • 創(chuàng)建子類對(duì)象
    • 訪問(wèn)靜態(tài)屬性
    • 調(diào)用靜態(tài)方法
    • 主動(dòng)加載:Class.forName("full-name")

1.1 class 文件

包名、類名、父類、屬性、方法、構(gòu)造方法.....

2. 類加載器

  • 在運(yùn)行期間,如果我們要產(chǎn)生某個(gè)類的對(duì)象,JVM 會(huì)檢測(cè)該類型的 Class 對(duì)象是否已被加載; 如果沒(méi)有加載,JVM 會(huì)根據(jù)類的名稱找到 .class 文件并加載它
  • Class 對(duì)象代表 Java 應(yīng)用程序在運(yùn)行時(shí)所加載的類或接口實(shí)例,每加載一個(gè)類,JVM自動(dòng)生成一個(gè)Class對(duì)象;

2.1 ClassLoader的分類

  • Bootstrap ClassLoader 啟動(dòng)類加載器(引導(dǎo)類加載器)
  • ExtClassLoader 擴(kuò)展類加載器(Java9 之后改為 Platform Classloader)
  • Application Classloader(系統(tǒng)類加載器或應(yīng)用類加載器)默認(rèn)的類加載器
  • 自定義類加載器,父類加載器為AppClassLoader

2.2 ClassLoader 層次結(jié)構(gòu)

  • 系統(tǒng)類加載器 --父--> 擴(kuò)展類加載器 --父--> 引導(dǎo)類加載器
  • 除了引導(dǎo)類加載器之外,所有的類加載器都有一個(gè)父類加載器。 通過(guò) getParent()方法可以得到
  • 注意:父加載器不是父類

2.3 類與類加載器

  • 在JVM中表示兩個(gè)class對(duì)象是否為同一個(gè)類對(duì)象的兩個(gè)必要條件
    • 類的全限定名必須一致
    • 加載這個(gè)類的ClassLoader必須相同
  • 在JVM中,即使這個(gè)兩個(gè)類對(duì)象(class對(duì)象)來(lái)源同一個(gè)Class文件,被同一個(gè)虛擬機(jī)所加載,但只要加載它們的ClassLoader實(shí)例對(duì)象不同,那么這兩個(gè)類對(duì)象也是不相等的

2.3 獲取 ClassLoader

@Test
public void getClassLoader() {
    Class<?> clazz = String.class;
    ClassLoader classLoader = clazz.getClassLoader();
    System.out.println(classLoader);
    // null, 根加載器并不是由Java語(yǔ)言實(shí)現(xiàn)的,因此拿不到根加載器對(duì)象
}
@Test
public void getClassLoader2() throws ClassNotFoundException {
    // this.getClass().getClassLoader();
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    Class<?> clazz = classLoader.loadClass("com.example.concrete.common.domain.User");
    System.out.println(classLoader);
    System.out.println(classLoader.getParent());
}

打印結(jié)果

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@51efea79

2.4 獲得class對(duì)象的三種方法

方式一:對(duì)象.getClass()

String str = "hello";
Class<?> clazz = str.getClass();

方式二:類.class
Class<?> clazz = String.class;

方式三:Class. forName() 動(dòng)態(tài)加載類

// 靜態(tài)方法 forName("類的全限定名")
Class<?> clazz3 = Class.forName("java.lang.String");

3. ClassLoader 分析

loadClass(String name)

findClass(String name)

defineClass(String name, byte[] b, int off, int len)

// ClassLoader 的默認(rèn)實(shí)現(xiàn)就是雙親委托
public abstract class ClassLoader {
  //每個(gè)類加載器都有個(gè)父加載器
  private final ClassLoader parent;
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, false);
  }
  protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
  }
  protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError {
    return defineClass(name, b, off, len, null);
  }
}

name: 類的全限定名

public Class<?> loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, false);
}
/**
 * classpath 就是一組目錄的集合;classpath 是 JVM 用到的一個(gè)環(huán)境變量,它用來(lái)指示 JVM 如何搜索class
 * 在啟動(dòng) JVM 時(shí)設(shè)置 classpath 變量
 * java -cp  or  java -classpath .;C:\work\project1\bin;C:\shared abc.xyz.Hello
 * 如果不設(shè)置,JVM 默認(rèn)的 classpath 為. 即當(dāng)前目錄
 */
String classpath = System.getProperty("java.class.path");
Properties properties = System.getProperties();
Set<String> strings = properties.stringPropertyNames();
for (String string : strings) {
    System.out.println(string);
}
/**
 * 若以“/”開頭的,表示要從項(xiàng)目的 ClassPath 開始的( /mapper/xxx.xml ),
 * 如果前面沒(méi)有這個(gè)“/”,那么表示的就是相對(duì)于該類的路徑繼續(xù)往下
 */
URL resource = classLoader.getResource("");  // file:/.../target/classes/
URL resource1 = classLoader.getResource("bean.xml");  // file:/.../target/classes/bean.xml

4. Classpath

  • lib 和 classes 同屬 classpath,訪問(wèn)優(yōu)先級(jí)為: lib > classes
  • Java 項(xiàng)目 /src 目錄下的文件(*.xml, *.properties)編譯后會(huì)放到 WEB-INF/classes 目錄,默認(rèn)的 classpath 就是 WEB-INF/classes
  • WEB-INF/ 是資源目錄,客戶端不能直接訪問(wèn)
  • Maven 項(xiàng)目 resources 目錄下的文件編譯后在 BOOT-INF/classes

4.1 maven 項(xiàng)目 classpath 路徑

Maven 項(xiàng)目目錄

src
  |-- main
    |-- java
      |-- com.xxx
  |-- resources
    |-- application.yml

編譯后目錄

target
  |-- classes
    |-- com.xxx
    |-- application.yml

打包的 jar 解壓后目錄

|-- BOOT-INF
  |-- classes
    |-- com.xxx
    |-- application.yml
  |-- lib
|-- org.springframework.boot.loader...

引用 classpath 路徑下的文件,只需在文件名前加 classpath:

classpath:application-*.xml
# 子目錄
classpath:config/*.xml
# **/ 表示任意目錄
classpath:**/bean.xml

4.2 classpath vs classpath*

  • classpath 在當(dāng)前classpath 中查找,只加載第一個(gè) classpath 路徑
  • classpath* 不僅包含 class 路徑, 還包括 jar 文件(classpath目錄)
  • classpath* 會(huì)從所有的classpath中加載文件
classpath:*.xml
classpath*:config.xml

以上就是Java ClassLoader類加載器基礎(chǔ)詳解的詳細(xì)內(nèi)容,更多關(guān)于Java ClassLoader類加載器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot過(guò)濾器禁止ip頻繁訪問(wèn)功能實(shí)現(xiàn)

    Springboot過(guò)濾器禁止ip頻繁訪問(wèn)功能實(shí)現(xiàn)

    這篇文章主要介紹了Springboot過(guò)濾器禁止ip頻繁訪問(wèn)功能實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • RabbitMQ TTL機(jī)制實(shí)踐建議

    RabbitMQ TTL機(jī)制實(shí)踐建議

    RabbitMQ提供的TTL(Time to Live,過(guò)期時(shí)間)特性恰好滿足這一需求,它支持對(duì)單個(gè)消息和整個(gè)隊(duì)列分別設(shè)置過(guò)期時(shí)間,靈活適配不同業(yè)務(wù)場(chǎng)景,本文給大家介紹RabbitMQ TTL機(jī)制實(shí)踐建議,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • 基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    這篇文章主要介紹了Spring?Boot?如何動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載,現(xiàn)項(xiàng)目有一個(gè)需求,期望通過(guò)在application.yml配置文件中設(shè)置一個(gè)開關(guān),來(lái)決定是否加載數(shù)據(jù)庫(kù),文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • SpringBoot整合Tomcat連接池的使用

    SpringBoot整合Tomcat連接池的使用

    這篇文章主要介紹了SpringBoot整合Tomcat連接池的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot整合JPA的實(shí)例代碼

    SpringBoot整合JPA的實(shí)例代碼

    本篇文章主要介紹了SpringBoot整合JPA的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • idea快速生成代碼配置的方法示例

    idea快速生成代碼配置的方法示例

    本文主要介紹了idea快速生成代碼配置的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()

    Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()

    在算法競(jìng)賽中,全排列問(wèn)題是一個(gè)經(jīng)典且常見的題目,傳統(tǒng)的遞歸方法在處理較大的n時(shí)會(huì)遇到堆棧內(nèi)存限制的問(wèn)題,本文介紹了一種避免遞歸,使用next_permutation函數(shù)實(shí)現(xiàn)全排列的方法,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java中synchronized實(shí)現(xiàn)原理詳解

    Java中synchronized實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java中synchronized實(shí)現(xiàn)原理詳解,涉及synchronized實(shí)現(xiàn)同步的基礎(chǔ),Java對(duì)象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • 使用jsoup解析html的table中的文本信息實(shí)例

    使用jsoup解析html的table中的文本信息實(shí)例

    今天小編就為大家分享一篇使用jsoup解析html的table中的文本信息實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • MyBatis-Plus使用ActiveRecord(AR)實(shí)現(xiàn)CRUD

    MyBatis-Plus使用ActiveRecord(AR)實(shí)現(xiàn)CRUD

    本文將結(jié)合實(shí)例代碼,介紹MyBatis-Plus使用ActiveRecord(AR)實(shí)現(xiàn)CRUD,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評(píng)論

浦江县| 博湖县| 乌兰浩特市| 冕宁县| 唐山市| 阿尔山市| 思茅市| 余姚市| 揭西县| 阿瓦提县| 深州市| 县级市| 凌云县| 江源县| 甘孜| 青龙| 内江市| 台南市| 论坛| 黎平县| 齐河县| 远安县| 武陟县| 铜梁县| 宾阳县| 靖安县| 清流县| 文化| 周宁县| 福海县| 临猗县| 乌鲁木齐市| 托克逊县| 东城区| 麻城市| 玉田县| 石楼县| 定远县| 大厂| 顺义区| 图们市|