簡體   English   中英

在Java中使用3個類加載器的原因是什么?

[英]What is the reason for having 3 Class loaders in Java

Java有3個類加載器:

  • 自舉,
  • 擴展和
  • 系統

他們有一個角色; 從不同的包加載類。

但是為什么Java有3個不同的類加載器而不是只有一個,因為一個類加載器可以加載所有必需的類?

擁有三個基本類加載器(Bootstrap,擴展,系統)的原因主要是安全性。

在JVM 1.2版之前,只有一個默認的類加載器,這就是當前所謂的“Bootstrap”類加載器。

類加載器加載類的方式是每個類加載器首先調用其父類,如果該父類沒有找到所請求的類,則當前的類正在查找它本身。

一個關鍵的概念是JVM不會授予包訪問權限(如果您沒有特別提到privatepublicprotected方法和字段的訪問權限),除非請求此訪問的類來自同一個類加載器 ,加載了它希望訪問的類。

因此,假設用戶調用他的類java.lang.MyClass 從理論上講,它可以獲得對java.lang包中所有字段和方法的包訪問,並改變它們的工作方式。 語言本身並不能阻止這種情況。 但是JVM會阻止它,因為所有真正的java.lang類都是由bootstrap類加載器加載的。 不一樣的裝載機=無法訪問。

類加載器中內置了其他安全功能,這使得很難進行某些類型的黑客攻擊。

那么為什么三個類加載器呢? 因為它們代表三個層次的信任。 最值得信任的類是核心API類。 接下來是已安裝的擴展,然后是類路徑中顯示的類,這意味着它們是您的計算機的本地。

有關更廣泛的解釋,請參閱Bill Venners的“Java虛擬機內部”

類加載器的主要用途是在應用程序服務器中。

您希望能夠啟動Tomcat(例如)。 這已經需要至少一個類加載器來運行tomcat本身。

然后,您希望能夠將應用程序部署到Tomcat中。 因此Tomcat本身需要加載一個分析應用程序的類,當Tomcat啟動時它們甚至都不存在。

然后,您希望能夠在Tomcat中部署另一個應用程序。 也許第二個應用程序使用的是第一個也使用的庫,但是使用的是另一個版本。 所以你希望每個應用程序都有自己獨立的類加載器,否則app 2的類可能會干擾app 1中的類。

然后,您希望能夠取消部署其中一個Web應用程序。 因此必須銷毀它的類加載器並進行垃圾收集,以避免巨大的內存泄漏。

當然還有許多其他用法,但這是最常用的(根據我的經驗)。

  1. 存在多個類加載器以同時加載多個應用程序(一個加載服務器和其他以在服務器中部署)。
  2. 每個加載器都有一個層次結構,只加載某些類以確保它們之間的安全性。

暫無
暫無

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

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