Java利用endorsed如何覆蓋jdk提供的類(lèi)詳解
前言
在之前我們分析 Tomcat catalina.bat 原理解析 時(shí)候,我們發(fā)現(xiàn)在啟動(dòng)tomcat的參數(shù)中存在 -Djava.endorsed.dirs 參數(shù)
如下圖:

-Djava.endorsed.dirs
Java提供了endorsed技術(shù):
關(guān)于 endorsed :可以的簡(jiǎn)單理解為 -Djava.endorsed.dirs 指定的目錄面放置的jar文件,將有覆蓋系統(tǒng)API的功能。但是能夠覆蓋的類(lèi)是有限制的,其中不包括java.lang包中的類(lèi)(出于安全的考慮)。
為什么必須使用 endorsed 進(jìn)行替換 jdk 中的類(lèi)呢?
因?yàn)閖ava是采用雙親委派機(jī)制進(jìn)行加載class類(lèi)的。而jdk提供的類(lèi)只能由類(lèi)加載器Bootstrap進(jìn)行加載。如果你想要在應(yīng)用程序中替換掉jdk中的某個(gè)類(lèi)是無(wú)法做到的,所以java提供了endorsed來(lái)達(dá)到你想要替換到系統(tǒng)中的類(lèi)。
示例
修改java.util.ArrayList類(lèi)中的 get(int index) 方法,在該方法中添加輸出獲取的值信息,如果是字符串直接輸出,如果不是則輸出類(lèi)信息,及加載該元素類(lèi)的classloader。代碼如下:

然后通過(guò)打包jar文件,放到一個(gè)目錄。
我這里是放到 “D:\endorsed” 該目錄下
測(cè)試類(lèi)
public class Bootstrap {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(10);
for(int i=0;i<10; i++){
list.add("test"+i);
list.get(i);
}
}
}
運(yùn)行的時(shí)候加上 -Djava.endorsed.dirs=D:\endorsed 參數(shù)。如下圖:

運(yùn)行結(jié)果

從結(jié)果中我們發(fā)現(xiàn),打印的信息不是我們程序中輸出的,而是ArrayList.get()方法中打印出來(lái)的。
endorsed 另一種修改方式
根據(jù)官方文檔描述:如果不想添加-D參數(shù),如果我們希望基于這個(gè)JDK下的都統(tǒng)一改變,那么我們可以將我們修改的jar放到:
$JAVA_HOME/jre/lib/endorsed
這樣基于這個(gè)JDK的所有的ArrayList都改變了?。?!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本小工具
文章介紹了如何使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本的工具,該工具可以將CURL腳本中的Header解析為KV Map結(jié)構(gòu),獲取URL路徑、請(qǐng)求類(lèi)型,解析URL參數(shù)列表和Body請(qǐng)求體,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-02-02
java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)
下面小編就為大家?guī)?lái)一篇java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
MyBatis?SQL映射文件的作用和結(jié)構(gòu)詳解
MyBatisSQL映射文件定義了SQL語(yǔ)句和參數(shù)映射規(guī)則,用于將Java代碼與數(shù)據(jù)庫(kù)操作解耦,實(shí)現(xiàn)SQL語(yǔ)句的靈活配置和動(dòng)態(tài)生成2025-03-03
Mybatis在insert插入操作后如何返回主鍵id問(wèn)題
這篇文章主要介紹了Mybatis在insert插入操作后如何返回主鍵id問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
JPA如何使用nativequery多表關(guān)聯(lián)查詢(xún)返回自定義實(shí)體類(lèi)
這篇文章主要介紹了JPA如何使用nativequery多表關(guān)聯(lián)查詢(xún)返回自定義實(shí)體類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java之Spring認(rèn)證使用Profile配置運(yùn)行環(huán)境講解
這篇文章主要介紹了Java之Spring認(rèn)證使用Profile配置運(yùn)行環(huán)境講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Java實(shí)現(xiàn)中國(guó)象棋的示例代碼
中國(guó)象棋是起源于中國(guó)的一種棋,屬于二人對(duì)抗性游戲的一種,在中國(guó)有著悠久的歷史。由于用具簡(jiǎn)單,趣味性強(qiáng),成為流行極為廣泛的棋藝活動(dòng)。本文將利用Java實(shí)現(xiàn)這一經(jīng)典游戲,需要的可以參考一下2022-02-02
SpringBoot ThreadLocal 簡(jiǎn)單介紹及使用詳解
ThreadLocal 叫做線程變量,意思是 ThreadLocal 中填充的變量屬于當(dāng)前線程,該變量對(duì)其他線程而言是隔離的,也就是說(shuō)該變量是當(dāng)前線程獨(dú)有的變量,這篇文章主要介紹了SpringBoot ThreadLocal 的詳解,需要的朋友可以參考下2024-01-01

