在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ 為什么java里面會(huì)用三種classloader,這樣設(shè)計(jì)目的是什么?

為什么java里面會(huì)用三種classloader,這樣設(shè)計(jì)目的是什么?

為什么java里面會(huì)用三種classloader,這樣設(shè)計(jì)目的是什么?還有雙親委派機(jī)制為什么要這么用? 看了不少原理,但是一直沒(méi)理解這么做的好處。

回答
編輯回答
伴謊
  1. BootstrapClassLoader:只能用于加載JDK核心類庫(kù),系統(tǒng)變量為sun.boot.class.path下面的類。該目錄下的%JAVA_HOME%/jre/lib/下的resources.jar;rt.jar等核心類庫(kù),該loader底層采用C++編寫,自然你也就不能調(diào)用啦。
  2. ExtClassLoader :用于加載一些擴(kuò)展類,系統(tǒng)變量為java.ext.dirs中的類。作用:加載開(kāi)發(fā)者自己擴(kuò)展類。
  3. AppClassLoader:用于加載用戶類,這個(gè)就是java.class.path下的類,也就是我們自己編寫出來(lái)的類。

其中這三個(gè)加載器順序?yàn)锽ootstrapClassLoader>ExtClassLoader>AppClassLoader,為啥要這樣設(shè)計(jì)?主要是為了擴(kuò)展與安全。首先你將BootstrapClassLoader作為一個(gè)核心類加載器,只加載核心類,不與其他耦合在一起。并且為何要設(shè)計(jì)這三個(gè)加載器,就應(yīng)該和雙親委派機(jī)制放在一起了。

何為雙親委派機(jī)制:簡(jiǎn)單來(lái)說(shuō)就是當(dāng)你需要加載類的時(shí)候,必須從頂級(jí)父加載器先加載,如果父加載不了,則交給子加載器。就相當(dāng)于小孩子要做決定的時(shí)候,要先問(wèn)問(wèn)父親怎么做。

為什么要有這種雙親委派機(jī)制:

  1. 保證唯一性:試想,如果沒(méi)有雙親委派模型而是由各個(gè)類加載器自行加載的話,如果用戶編寫了一個(gè)java.lang.Object的同名類并放在ClassPath中,多個(gè)類加載器都去加載這個(gè)類到內(nèi)存中,系統(tǒng)中將會(huì)出現(xiàn)多個(gè)不同的Object類,那么類之間的比較結(jié)果及類的唯一性將無(wú)法保證.
  2. 保證安全:由于所有的用戶類都會(huì)先通過(guò)bootstrapclassloader 查看里面有沒(méi)有該類資源,有則直接安徽或者加載,從而保證了底層的類一定是預(yù)先加載的,這樣可以對(duì)虛擬機(jī)的安全得到了很好的保證。
2017年1月11日 09:02
編輯回答
歆久

classloader最頂級(jí)的那個(gè)就是bootstrapclassloader,至于為什么要設(shè)計(jì)雙親委派機(jī)制這種模型,說(shuō)的簡(jiǎn)單一點(diǎn)其實(shí)就是為了保護(hù)JDK的安全性,如果你自己寫了一個(gè)System這個(gè)類,如果沒(méi)有這種機(jī)制,那么你自己寫的這個(gè)類將被加載,這樣對(duì)JDK的入侵是很大的,那么現(xiàn)在有這種機(jī)制,bootstrapclassloader會(huì)去rt包下找是否有System這個(gè)類,如果有,那么直接就加載了JDK自己的這個(gè)類,對(duì)于新定義的這個(gè)類則不會(huì)做處理,設(shè)計(jì)者設(shè)計(jì)這樣的模式對(duì)保護(hù)JDK的完整性和一致性都是有好處的。

2018年3月6日 12:58