首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java ClassLoader 載入類、資源文件、Web 資源完整指南

     編輯:Java 相關知識

ClassLoader 核心職責

JVM 需要類時,委派 ClassLoader 根據全限定名載入並返回 `Class` 物件。每個類持有對自己 ClassLoader 的引用。ClassLoader 負責載入所有資源:類、配置文件、圖片、網路位元組流等。

三種獲取 ClassLoader 方式

this.getClass().getClassLoader();                    // 當前類的 ClassLoader
Thread.currentThread().getContextClassLoader();      // 當前線程上下文 ClassLoader
ClassLoader.getSystemClassLoader();                  // 系統 ClassLoader(App ClassLoader)

注意:System ClassLoader ≠ Bootstrap ClassLoader(啟動類加載器,載入 rt.jar)。

類載入三種方式

// 1. Class.forName(靜態方法,觸發初始化)
Class cls = Class.forName("com.alexia.B");
B b = (B) cls.newInstance();

// 2. ClassLoader.loadClass(僅載入,不初始化)
ClassLoader cl = this.getClass().getClassLoader();
Class cls = cl.loadClass("com.alexia.B");
B b = (B) cls.newInstance();

// 3. 直接 new(最常用,但受包訪問限制)
B b = new B();

為何需要反射? 有包名的類無法直接 `new` 無包名類;`newInstance()` 要求類已載入並鏈接,`forName()` 完成此過程,提供解耦彈性。

資源文件載入(配置文件等)

方式 1:IO 流(絕對/相對路徑)

File f = new File("C:/test/com/alexia/config/sys.properties"); // 絕對
File f = new File("com/alexia/config/sys.properties");         // 相對(相對工作目錄)
InputStream is = new FileInputStream(f);

方式 2:ClassLoader.getResourceAsStream(推薦,相對 classpath 根)

InputStream is = this.getClass().getClassLoader()
    .getResourceAsStream("com/alexia/config/sys.properties");
// 或 Thread.currentThread().getContextClassLoader()...

方式 3:ResourceBundle(專為 properties 設計)

ResourceBundle bundle = ResourceBundle.getBundle("com.alexia.config.sys");

注意:`Properties.load()` 預設 ISO-8859-1 編碼,中文需轉碼。

Web 應用資源載入

目錄結構:

ContextRoot/
├── JSP/HTML/Image
└── WEB-INF/
    ├── web.xml
    ├── lib/
    └── classes/   <-- 類與資源文件
  • 讀取 `classes` 下資源:用 ClassLoader
  • 讀取其他(如 `WEB-INF/web.xml`、靜態檔):用 `ServletContext.getResource("/path")`,路徑必須以 `/` 開頭,相對 ContextRoot

總結

資源類型推薦方式
類直接 new / Class.forName / ClassLoader
classpath 下文件ClassLoader.getResourceAsStream
properties 配置ResourceBundle / Properties.load
Web 靜態資源ServletContext.getResource

出處:bianceng.cn

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved