阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...
前情回顧
秋招面試中,我每次面試似乎都被問到關于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之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看网页HTML源代码违法,属于“黑客”
- 下一篇: Facebook全球宕机6小时!小扎损失