Java 9 中類載入器的變化是什麼?
所有 Java 程式都執行在 **Java 虛擬機器 (JVM)** 上。編譯後,Java 類會轉換為 **平臺** 和 **機器無關的位元組碼**,編譯後的類儲存為 **.class** 檔案。每當我們嘗試使用它時,**類載入器** 會將該類載入到記憶體中。當類透過名稱被引用時,這些類就會被引入 Java 環境。類的載入是由類載入器完成的,一旦類開始執行,**main()** 方法就是啟動該類的方法。
Java 9 中類載入器有一些細微的變化
- **系統類載入器** 在 Java 9 中不再存在,它不再是 **URLClassLoader** 的例項,而是一個內部類。它是模組中類的 **預設載入器**。
- **擴充套件類載入器** 已重新命名為 **平臺類載入器**。所有 Java SE 平臺中的類都可以透過平臺類載入器訪問,Java 社群程序下的模組中的類(但不是 Java SE 平臺的一部分)也可以透過平臺類載入器訪問。
- **應用程式** 不能依賴於定義某些 Java SE 平臺類所在的類載入器,其中一些類由平臺類載入器定義,而另一些類由 **引導類載入器** 定義。
- 如果現有程式碼建立的類載入器以引導類載入器作為父類載入器,則需要更改為使用平臺類載入器作為父類載入器。
- **平臺類載入器** 不是 **URLClassLoader** 的例項,而是一個內部類。
- **引導類載入器** 是 JVM 的 **內建類載入器**。但是,它定義了關鍵模組(例如 **base**)的類。使用 **-Xbootclasspath/a** 部署的應用程式或建立以 **null** 作為 **父類載入器** 的類載入器可能需要更改。
示例
public class ClassLoaderTest {
public static void main(String args[]) {
System.out.println("Class Loader Test");
ClassLoaderTest test = new ClassLoaderTest();
try {
test.showClassLoaders();
} catch(ClassNotFoundException cnfe) {
System.out.println(cnfe.getMessage());
}
}
public void showClassLoaders() throws ClassNotFoundException {
System.out.println("Classloader of this class: " + ClassLoaderTest.class.getClassLoader());
System.out.println("Classloader of Permission: " + java.sql.SQLPermission.class.getClassLoader());
System.out.println("Classloader of LinkedList: " + java.util.LinkedList.class.getClassLoader());
return;
}
}輸出
Class Loader Test Classloader of this class: jdk.internal.loader.ClassLoaders$AppClassLoader@504bae78 Classloader of Permission: jdk.internal.loader.ClassLoaders$PlatformClassLoader@299a06ac Classloader of LinkedList: null
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP