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

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

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

回答
編輯回答
逗婦乳

思考以下情景:

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

小結(jié):
jvm 需要有不同的類加載器,因?yàn)樗环矫嬖试S你在一個(gè) jvm 里運(yùn)行不同的應(yīng)用程序,另一方面方便你獨(dú)立的對(duì)不同類庫(kù)進(jìn)行運(yùn)行時(shí)增強(qiáng)。

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.

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

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

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

2017年11月13日 06:48