目錄
如何用Java實作類別載入器?
Java 中的 ClassLoader 是如何運作的?
類別載入器的類型
1.引導類別載入器
2.擴充類別載入器
3.應用程式類別載入器
類別載入器洩漏
Principles of Java ClassLoader
Example of Custom ClassLoader
首頁 Java java教程 Java 中的類別載入器

Java 中的類別載入器

Aug 30, 2024 pm 04:04 PM
java

ClassLoader 是負責在執行時間動態載入 Java 類別的對象,以防止 JVM 意識到 ClassLoader 是 Java 執行時間環境的一部分。它使 JVM 的生活更輕鬆。 JVM 在應用程式需要時將類別載入到記憶體中,並且不會一次載入所有類別。然後 ClassLoader 介入並將類別載入到記憶體中。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

如何用Java實作類別載入器?

讓我們看看 java.lang.ClassLoader 在 Java 函式庫程式碼中是如何實現的以及它的功能是什麼。

java.lang.ClassLoader:

public abstract class ClassLoader {
public class loadClass(String name);
protected class defineClass(byte[] b);
public URL getResource(String name);
public Enumeration getResources(String name);
public ClassLoader getParent()
};
登入後複製

我們來看看java的ClassLoader有哪些功能:

  • loadClass(): 這是一個重要的方法,它將類別的名稱作為字串並傳回類別的實例,這將是類別載入器的類別在其類別路徑中找到,它將提供它,以便可以從中實例化物件。
  • defineClass(): 此方法的工作方式與loadClass 方法類似,不同之處在於它採用字節數組作為參數,然後從該位元組數組創建一個類,這意味著它採用類別本身作為位元組數組。它與 loadClass 方法略有不同,因為類別本身以位元組數組的形式給出,而 loadClass 需要找到該類別來載入它。
  • getResource() 或 getResources(): 此方法是診斷與載入類別相關的任何問題的關鍵,因為當您提供字串名稱和套件名稱。它將為您提供類別載入位置和載入方式的確切路徑,保留您的所有假設。
  • getparent():是理解classLoader層次結構的關鍵方法。 ClassLoader 不是一個平面結構,並且有父級和子層級結構以及層級和層級的結構。

Java 中的 ClassLoader 是如何運作的?

示範類別載入器如何運作的範例:

代碼:

public class A() {
public void addOne() {
B b = new B();
b.addTwo();
}
}
登入後複製

ClassLoader 在上述場景中如何載入類別:

  • 我們可以看到,在上面的程式碼中,類別 A 呼叫了函數 addOne()。在該函數內部,建立了 B 類別的實例,並呼叫了 B 類別的另一個方法 addTwo()。
  • 所以類別載入器會載入類別A,然後類別載入器會載入類別B。所以呼叫會像class.getClassLoader().loadClass(“B”);
  • 由於類別載入器的這項特性,我們可以擁有類別的層次結構並解碼它們的連接。

類別載入器的類型

在本教程中,我們將討論不同類型的類別載入器及其內建功能以及使用它的原因。

1.引導類別載入器

  • Java ClassLoader 也是 java.lang 的一個實例。 ClassLoader,它是一個類,試想誰會載入ClassLoader類別。我們將看到 Bootstrap ClassLoader 出現的場景。
  • 它將載入 $JAVA_HOME/jre/lib 目錄中的所有 rt.jar 和其他核心函式庫。
  • 它充當所有其他類別載入器實例的父級。
  • 它是JVM部分之一,用Native程式碼編寫;因此,這個特定的 ClassLoader 的實作可能會改變。

2.擴充類別載入器

擴充類別載入器是 Bootstrap 的子類別。它用於載入進入 JVM 的所有 Java 類別的擴充。

3.應用程式類別載入器

  • 它是擴充類別載入器的子級。
  • 用於載入類別路徑環境變數--classpath或--cp中的所有應用程式層級類別。

類別載入器洩漏

每個類別都有一個指向它所建立的所有類別的連結。它實際上需要有一個記憶體來儲存靜態字段。如果 classLoader 洩漏任何單一類別的任何靜態字段,則僅表示您洩漏了 ClassLoader。如果這樣做,您將洩漏所有類別和一堆物件以及它們連結到的所有物件。類別載入器洩漏可能太危險了。

每次我們在應用程式的執行階段重新部署或新增增強功能時,ClassLoader 都會載入一個類,而不會重新載入或卸載一個類別。因此,當類別載入器從頭開始載入單一類別時,它將具有一些對象,以便從頭開始重新建立或重新載入它,舊類別載入器將物件從舊狀態傳送到新狀態。所以在這個轉變過程中,可能會出現洩漏。所以當你洩漏一個物件時,你就洩漏了一個類,所以它是類別載入器。

Principles of Java ClassLoader

There are 3 principles that a java ClassLoader works upon:

  • Delegation Model: It delegates class loading requests to parent ClassLoader and loads class only if the parent is not able to find or load the class.
  • Visibility Principle: This principle states the visibility scope of loaded classes. Class loaded by its parent is visible to parent class loaders, but the class loaded by its child is not visible to the parent class loader.
  • Uniqueness Property: It ensures that there is no repetition of classes in the class loader. If a parent loads a class, then its corresponding child does not load this class.

Example of Custom ClassLoader

This is the custom ClassLoader example named with ClassLoaderJava.java:

Code: ClassLoaderJava.java

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ClassLoaderJava extends ClassLoader{
// created to load class and invoke method.
public void classLoadingDemo(String classBinString, String methodName) {
try {
// will create an instance of class loader. ClassLoader classLoaderInstance =
this.getClass().getClassLoader();
// creating an instance of a class to store the loaded class. Class loadedClass =
classLoaderInstance.loadClass(classBinString);
System.out.println("Loaded class name is: " + loadedClass.getName());
// Fetching the constructor of loaded class. Constructor con = loadedClass.getConstructor();
// creating an instance to invoke the method. Object obj = con.newInstance();
// Will store the method fetched from loaded class.
Method invokingMethod = loadedClass.getMethod(methodName); System.out.println("Invoked method name is: " +
invokingMethod.getName());
invokingMethod.invoke(obj);
} catch (ClassNotFoundException e) { e.printStackTrace();
} catch (Exception e) { e.printStackTrace();
}
}
}
登入後複製

Code: DemoClass.java

public class DemoClass {
public void add() {
System.out.println("This method is invoked by the classLoader.");
}
}
登入後複製

Code: LoadingTest.java

public  class  LoadingTest  {
public  static  void  main(String[]  args)  {
ClassLoaderJava classLoader = new ClassLoaderJava();
classLoader.classLoadingDemo("DemoClass" , "add");
}
}
登入後複製

Output:

Java 中的類別載入器

以上是Java 中的類別載入器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1659
14
CakePHP 教程
1415
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1232
24
突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP:許多網站的基礎 PHP:許多網站的基礎 Apr 13, 2025 am 12:07 AM

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

See all articles