鍍金池/ 問答/Java  網(wǎng)絡安全/ JAVA為什么要有多個類加載器,1個不行嗎

JAVA為什么要有多個類加載器,1個不行嗎

JAVA為什么要有多個加載器
我知道加載器作用是通過類名來獲取二進制字節(jié)流。主要分為四種加載器,啟動類->擴展類->應用類->自定義類。我也知道雙親委派機制的好處,就是越基礎的類交給越高級的加載器加載。
我問題是只有一個加載器來加載全部的類不行嗎,這樣的話也就不存在什么不使用雙親委派機制的問題了
還是不懂

回答
編輯回答
逗婦乳

思考以下情景:

  1. 首先,是為了區(qū)分同名的類:假定存在一個應用服務器,上面部署著許多獨立的應用,同時他們擁有許多同名卻不同版本的類庫。試想,這時候 jvm 該怎么加載這些類同時能盡可能的避免掉類加載時對同名類的差異檢測呢?當然是不同的應用都擁有自己獨立的類加載器了。
  2. 其次,是為了更方便的加強類的能力:類加載器可以在 load class 時對 class 進行重寫和覆蓋,在此期間就可以對類進行功能性的增強。比如添加面向切面編程時用到的動態(tài)代理,以及 debug 等原理。怎么樣達到僅修改一個類庫而不對其他類庫產(chǎn)生影響的效果呢?一個比較方便的模式就是每個類庫都可以使用獨立的類加載器

小結:
jvm 需要有不同的類加載器,因為它一方面允許你在一個 jvm 里運行不同的應用程序,另一方面方便你獨立的對不同類庫進行運行時增強。

2018年6月14日 07:09
編輯回答
逗婦乳

Each class loader is designed to load classes from different locations. For instance, you can actually create a class loader that will load a class file from a networked server or download the binary of a class from a remote web server, etc. The logic that performs this operation is baked into the class loader itself and provides a consistent interface so that clients can load classes regardless of how the class loader actually performs the loading. The BootstrapClassLoader is capable of loading classes from the JVM_HOME/lib directory...but what if you need to load them from a different location??

In short, because there as an infinite (well, not quite) number of ways to load classes and there needs to be a flexible system to allow developers to load them however they want.

每一個類加載器都是為了去在不同的情景下去加載類。比如,你可以從聯(lián)網(wǎng)服務器上加載一個class文件,也可以從遠程web服務器下載二進制類。這么設計是因為我們需要類加載器提供一致的接口,這樣客戶端就可以加載類但是卻不用管類加載器到底是怎么實現(xiàn)的。啟動類加載器能夠加載JVM_HOME/lib 下的類,但如果我們需要在其他的情況下加載類呢?簡單來說,加載類的方法有無數(shù)種,我們需要一個靈活的加載器系統(tǒng)去在特定的情況下按照我們的想法來加載類。

2017年7月5日 01:17
編輯回答
孤島

雖然 對java 虛擬機沒有研究過,java 為什么不能 一個加載器 加載全部的類
很明顯, 實現(xiàn)起來也可以
但是需要 的 代碼 更多,也更難 為各種類進行 優(yōu)化,為了更簡單的抽象
我在明確知道 該類是啟動類的情況下,我就會 為該類 進行優(yōu)化。
如果是自定義類,可能就 不會進行 此類優(yōu)化。
在明確 目的的情況下, 專用代碼 比 通用代碼 更簡單,也更有效。

2017年11月13日 06:48