日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前情回顧

秋招面試中,我每次面試似乎都被問到關于JVM雙親委派的相關問題。

我先考考你:你是怎么理解雙親委派機制的?這個名字你有沒有覺得有問題?能舉個簡單例子說明一些雙親委派嗎?雙親委派有何好處?如何打破雙親委派?

幾乎所有相關問題都列舉啦,以上問題我全部有幸被問過。

話不多說,正文開始~

典型案例

我們看如圖案例,或許很多小伙伴在初學時可能都犯過。我看一些朋友留言說再學習SpringBoot時也犯過類似錯誤。

我自定義了一個類 Java.lang.String,然后在 main 方法里打印了一句話,運行直接報錯。有小伙伴可能會想,明明類里面定義了main方法,為何報錯 “找不到main方法” 。

可以短暫思考一下為何

其實,如果你明白 “雙親委派機制” 那這個問題你便可以很輕松搞懂啦。

首先,運行程序肯定先執行main方法,要執行main方法就得先加載其類,也就是 java.lang.String ,類加載請求來到類加載器,會一層一層往上委派,最終來到引導/啟動類加載器(Bootstrap ClassLoader)。

然后該類加載器發現 java.lang.String 是核心API里面的類,是自己管理范疇(加載核心類庫(JAVA_HOME/lib 如rt.jar)),于是加載的核心API里面的那個 java.lang.String ,但是這個 String 類里面是沒有main方法的,于是報錯了。

雙親委派機制

何為雙親委派機制?

通過上述例子,大家應該差不多對 雙親委派機制 有所體會啦,此處再作歸納總結:

我喜歡簡單通俗易懂的表達。

含義:類加載請求來了,類加載器自己先不加載,先讓父類加載器加載,父類不行自己再來 。

畫個圖結合理解一下。

順帶說一下這幾個加載器的作用(同被考過許多次 阿里 京東):

  • 啟動類加載器:加載核心類庫(JAVA_HOME/lib 如rt.jar)

  • 擴展類加載器:加載擴展類(JAVA_HOME/jre/lib/ext)

  • 系統類加載器:加載用戶類路徑ClassPath下的類

  • 用戶自定義加載器:繼承java.lang.ClassLoader

如何打破雙親加載機制?

自定義類加載器,重寫 loadClass 方法、線程上下文類加載器

具體哪里有所體現呢?

Java 涉及 SPI 機制的都用線程上下文類加載器。父類加載器請求子類加載器完成加載動作 SPI機制:為接口找尋服務(jdbc) SPI約定:服務提供者為接口提供接口實現后,會在 jar 包的 META-INF/service/目錄下創建一個以服務接口命名的文件。

jdb4.0 使用 SPI 機制,DriverManage r需要去 jar 包下的 META-INF/services/java.sql.Driver 目錄下去尋找對應的 Driver 加載,但是 DriverManager 在 rt.jar 中,使用啟動類加載器(BootStrapClassLoader),他需要調用服務提供者放在classpath下的類,啟動類加載器無法加載,就只得使用線程上下文加載器,讓父類加載器調用子類加載器完成,打破了雙親委派機制。

雙親委派機制好處?

還是簡單提取關鍵字,因為本專欄是針對面試的,盡量通俗簡介易記。

好處:避免類重復加載+防止核心類篡改+安全性

具體體現可以結合本文開頭的例子,假想可以篡改核心類,我自己定義一個類植入錯誤程序就可以使得整個系統崩潰。

你是否覺得 雙親委派 這個名字有問題?

哈哈 其實讀完上文這個問題已經很清楚啦,明明是父類委派加載,為啥要叫雙親委派??

官方文檔對 雙親委派 解釋:

The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a “parent” class loader. When loading a class, a class loader first “delegates” the search for the class to its parent class loader before attempting to find the class itself.

java平臺通過委派模型去加載類。每個類加載器都有一個父加載器。當需要加載類時,會優先委派當前所在的類的加載器的父加載器去加載這個類。如果父加載器無法加載到這個類時,再嘗試在當前所在的類的加載器中加載這個類。

所以,java 的 類加載機制 應該叫做 “父委派模型”,不應該叫做“雙親委派機制”。翻譯問題吧,我覺得是,不必太過糾結,我想面試官這樣問,只是看你是否真正理解雙親委派機制,你就把 雙親委派機制原理 講給他聽就是。

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。