1. 程式人生 > >為什麼Java中有三種基礎的類載入器?

為什麼Java中有三種基礎的類載入器?

引言

Java中有三種基礎的類載入器 BootStrap、Extension、System

他們都有一個職能,就是從不同的包中載入類。

但是一個類載入器完全可以載入所有的類,為什麼要有3種基礎的型別的類載入器呢?

最佳答案

Java中有三種基礎的類載入器主要為了安全。

1.2版本的JVM中,只有一個類載入器,就是現在的“Bootstrap”類載入器。

類載入器載入類的方式是,載入器先呼叫父載入器對類進行載入,如果父載入器找不到該類,此載入器才會去載入該類。

最關鍵的是, 除非是同一個類載入器載入的類 ,否則JVM不會保證包訪問級別(如果不指明private/public或protected,則方法和屬性具有包訪問級別)。

因此,假如使用者呼叫他編寫的java.lang.MyClass類。理論上該類可以訪問和改變java.lang包下其他類的預設訪問修飾符的屬性和方法的能力。Java語言本身並沒有阻止這種行為。但是JVM則會阻止這種行為,因為java核心類庫的java.lang包下的類是由bootstrap類載入器載入的。不是同一個類載入器載入的類等於不具有包級別的訪問許可權。

類載入器中的其他安全特性也會阻止這種型別侵入。

所以為什麼有三種基礎的類載入器?是因為他們代表三種不同的信任級別。最可信的級別是java核心API類。然後是安裝的拓展類,最後才是在類路徑中的類(屬於你本機的類)。

想了解更多詳情,參見:

Why Security?

其他解釋1

類載入主要的應用場景是在應用伺服器上。

如果你想啟動Tomcat。這至少需要一個類載入器來執行Tomcat自己。

然後你想在Tomcat容器中部署專案。因此Tomcat需要載入和分析甚至在Tomcat啟動前都不存在的類。

然後你又想在Tomcat中部署另外一個應用。 第二個應用可能也會用到第一個應用使用的庫,但是版本不同。

因此你就需要每個應都有相互隔離的類載入器,否則第二個應用的類可能會覆蓋第一個應用之前載入的類,從而造成一些意想不到的後果。

然後你想停掉某個web應用。該應用的類載入器應該會被銷燬,垃圾也隨之被回收,這樣可以避免記憶體洩露。

或許類載入器還有其他用途,但這是我印象中最常見的用法。

其他解釋2

引言

Java中有三種基礎的類載入器 BootStrap, Extension and System

他們都有一個職能,就是從不同的包中載入類。

但是一個類載入器完全可以載入所有的類,為什麼要有3種基礎的型別的類載入器呢?

最佳答案

Java中有三種基礎的類載入器主要為了安全。

1.2版本的JVM中,只有一個類載入器,就是現在的“Bootstrap”類載入器。

類載入器載入類的方式是,載入器先呼叫父載入器對類進行載入,如果父載入器找不到該類,此載入器才會去載入該類。

最關鍵的是, 除非是同一個類載入器載入的類 ,否則JVM不會保證包訪問級別(如果不指明private/public或protected,則方法和屬性具有包訪問級別)。

因此,假如使用者呼叫他編寫的java.lang.MyClass類。理論上該類可以訪問和改變java.lang包下其他類的預設訪問修飾符的屬性和方法的能力。Java語言本身並沒有阻止這種行為。但是JVM則會阻止這種行為,因為java核心類庫的java.lang包下的類是由bootstrap類載入器載入的。不是同一個類載入器載入的類等於不具有包級別的訪問許可權。

類載入器中的其他安全特性也會阻止這種型別侵入。

所以為什麼有三種基礎的類載入器?是因為他們代表三種不同的信任級別。最可信的級別是java核心API類。然後是安裝的拓展類,最後才是在類路徑中的類(屬於你本機的類)。

想了解更多詳情,參見:Why Security?

其他解釋1

類載入主要的應用場景是在應用伺服器上。

如果你想啟動Tomcat。這至少需要一個類載入器來執行Tomcat自己。

然後你想在Tomcat容器中部署專案。因此Tomcat需要載入和分析甚至在Tomcat啟動前都不存在的類。

然後你又想在Tomcat中部署另外一個應用。 第二個應用可能也會用到第一個應用使用的庫,但是版本不同。

因此你就需要每個應都有相互隔離的類載入器,否則第二個應用的類可能會覆蓋第一個應用之前載入的類,從而造成一些意想不到的後果。

然後你想停掉某個web應用。該應用的類載入器應該會被銷燬,垃圾也隨之被回收,這樣可以避免記憶體洩露。

或許類載入器還有其他用途,但這是我印象中最常見的用法。

其他解釋2

  • 多種類載入器待辦可以同時載入多個應用程式(一個載入服務,另外的載入器用來伺服器內部的部署)。
  • 每種載入器都有對應的層級來載入某些特定的類,來保證他們之間的安全性。

英文原文:lonelycoding.com/what-is-the…