簡體   English   中英

Java Class 裝載機的用途是什么?

[英]What is the purpose of the Java Class loader?

我的問題是,JVM 什么時候加載項目中的所有類? 另外,為什么我們需要 class 加載程序的概念。

如果您能給我一個示例,說明您使用 class 加載程序以及為什么在這種情況下使用 class 加載程序,我會很高興。

JVM 什么時候加載項目中的所有類。

JVM 或多或少地“按需”加載類。 即,運行時中的所有類通常不會在啟動時加載。

有關此主題的詳細信息,請參閱這些 URL:

為什么我們需要 class 加載程序的概念

Class 加載器允許我們從各種來源加載類。

  • 磁盤上的 jar 文件
  • 運行時生成的字節數組
  • 來自 Internet(這是小程序的典型用例)

這使得應用程序的啟動更加靈活和模塊化。

給我一個例子,說明你使用 class 裝載機的情況,以及為什么你在那里使用 class 裝載機。

如果沒有類加載器,您將走不了多遠,因此我將您的問題解釋為“您何時需要自定義class 加載器”。

就我個人而言,我使用字節碼操作庫 ( ASM ) 進行了一些實驗,其中我用 get 和 set 方法調用替換了字段訪問。 我使用自定義 class 加載器在加載類時重寫它們。 我不知道這是否是一個典型的用例,但關鍵是沒有一個我不可能做到這一點!

您還可以想象一個插件系統,它從某個插件目錄加載外圍類。

每當直接執行 class 或在另一個要執行的 class 中引用它時,都會加載 class ... 例如

class A
{}  
class B extends A  
{  
  public static void main(String arr[])  
  {}  
}  

在這里,每當您執行 class B 時,自動加載 class A

現在考慮這個

class A  
{}  

class B  
{  
  public static void main(String arr[])  
  {  
    A ob=new A();//here class A is need to be loaded by JRE  
  }  
}

JVM 在第一次被引用時加載 Class。 有關 Class 裝載機的深入分析,請看這里

JVM 按需加載類。 當您需要顯式加載 class 時,您需要從主 class 中引用該 class,例如


static {
    MyClass.class.getName();
}

Custom classloader is rarely needed, most commons cases are: AOP (for example runtime on-load instrumentation of classes with Javassist), remote class loading (loading a class from remote location), encrypted class loading (deciphering class code and loading).

如果您正在開發可以支持插件的應用程序,您可以使用 class 加載器來加載類。 示例:您有視頻播放器應用程序,每個編解碼器都是您應用程序中的插件。 你有文件夾。/編解碼器,你把你的插件編解碼器放在那里。 您在文件夾中搜索 jar 文件並使用 Class 加載程序加載所有 jar 文件。

Class loader 用在很多情況下。 幾個例子是:

  1. Class.forName 在運行時獲取 Java 類
  2. 反射 API
  3. Eclipse 調試器

還有很多其他的例子。

默認 Class 加載程序將僅加載一次.class 文件,即使您在程序中多次使用該文件。 加載.class 文件后,如果在外部修改,則默認 class 加載器不會加載 class 文件的更新版本(.ZA2F2ED4F2ED4F2EBC2CBB61DZC4 方法文件1 已在區域可用)。 您可以通過定義自己的自定義 Class 加載程序來解決此問題。

定制 class 裝載機的主要優點是您可以根據您的要求控制 class 裝載機制。

java.lang.ClassLoader定義自己定制的 class 加載器。 Every class loader in JAVA should be child class of java.lang.ClassLoader class, either directly of indirectly. 因此,此 class 充當所有定制 class 裝載機的基礎 class。

注意:在設計/開發 web 服務器和應用服務器時,通常使用定制的 class 加載器來定制 class 加載機制。

例如:

public class CustClassLoader extends ClassLoader{
     public Class loadClass(String cname) throws ClassNotFoundException{
     //check for updates and laod updated .class
     //file and returns corresponding Class
     }
}

class Client{
    public static void main(String [] args){
         Dog d1 = new Dog();
         CustClassLoader c1 = new CustClassLoader();
         c1.loadClass("Dog");
         //
         // 
         //
         c1.loadClass("Dog");
         //
     //
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM