十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容主要講解“Java雙親委派機(jī)制的原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java雙親委派機(jī)制的原理”吧!
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、云城網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、云城網(wǎng)絡(luò)營銷、云城企業(yè)策劃、云城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供云城建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
我打開了我的AndroidStudio,搜索了下“ClassLoader”,然后打開“java.lang”包下的ClassLoader類。然后將代碼翻到loadClass方法:
public Class> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
// -----????????-----
protected Class> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class> c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
return c;
}
其實(shí)這段代碼已經(jīng)很好的解釋了雙親委派機(jī)制,為了大家更容易理解,我做了一張圖來描述一下上面一段代碼到底是怎么做的:
從上圖中我們就更容易理解了,當(dāng)一個Hello.class這樣的文件要被加載時。不考慮我們自定義類加載器,首先會在AppClassLoader中檢查是否加載過,如果有那就無需再加載了。如果沒有,那么會拿到父加載器,然后調(diào)用父加載器的loadClass方法。父類中同理會先檢查自己是否已經(jīng)加載過,如果沒有再往上。注意這個過程,知道到達(dá)Bootstrap classLoader之前,都是沒有哪個加載器自己選擇加載的。如果父加載器無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException。
這種設(shè)計有個好處是,如果有人想替換系統(tǒng)級別的類:String.java。篡改它的實(shí)現(xiàn),但是在這種機(jī)制下這些系統(tǒng)的類已經(jīng)被Bootstrap classLoader加載過了,所以并不會再去加載,從一定程度上防止了危險代碼的植入。
到此,相信大家對“Java雙親委派機(jī)制的原理”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!