Java利用endorsed如何覆蓋jdk提供的類詳解
前言
在之前我們分析 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的功能。但是能夠覆蓋的類是有限制的,其中不包括java.lang包中的類(出于安全的考慮)。
為什么必須使用 endorsed 進(jìn)行替換 jdk 中的類呢?
因?yàn)閖ava是采用雙親委派機(jī)制進(jìn)行加載class類的。而jdk提供的類只能由類加載器Bootstrap進(jìn)行加載。如果你想要在應(yīng)用程序中替換掉jdk中的某個(gè)類是無法做到的,所以java提供了endorsed來達(dá)到你想要替換到系統(tǒng)中的類。
示例
修改java.util.ArrayList
類中的 get(int index)
方法,在該方法中添加輸出獲取的值信息,如果是字符串直接輸出,如果不是則輸出類信息,及加載該元素類的classloader。代碼如下:
然后通過打包jar文件,放到一個(gè)目錄。
我這里是放到 “D:\endorsed” 該目錄下
測(cè)試類
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()
方法中打印出來的。
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í)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ajax實(shí)時(shí)監(jiān)測(cè)與springboot的實(shí)例分析
本文將介紹如何使用 AJAX 技術(shù)結(jié)合 Spring Boot 構(gòu)建一個(gè)實(shí)時(shí)反饋用戶輸入的應(yīng)用,我們將創(chuàng)建一個(gè)簡(jiǎn)單的輸入框,當(dāng)用戶在輸入框中鍵入文本時(shí),應(yīng)用將異步地向后端發(fā)送請(qǐng)求,感興趣的朋友跟隨小編一起看看吧2024-07-07Shiro在springboot中快速實(shí)現(xiàn)方法
Apache Shiro是一個(gè)Java的安全(權(quán)限)框架,可以容易的開發(fā)出足夠好的應(yīng)用,既可以在JavaEE中使用,也可以在JavaSE中使用,這篇文章主要介紹了Shiro在springboot中快速實(shí)現(xiàn),需要的朋友可以參考下2023-02-02Spingboot?JPA?CriteriaBuilder?如何獲取指定字段
這篇文章?主要介紹了Spingboot?JPA?CriteriaBuilder?如何獲取指定字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Redisson RedLock紅鎖加鎖實(shí)現(xiàn)過程及原理
本文主要介紹了Redis中Redisson紅鎖(Redlock)使用原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了java使用POI批量導(dǎo)入excel數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07SpringBoot詳解如何進(jìn)行整合Druid數(shù)據(jù)源
Druid是阿里開發(fā)的一款開源的數(shù)據(jù)源,被很多人認(rèn)為是Java語言中最好的數(shù)據(jù)庫連接池,本文主要介紹了SpringBoot整合Druid數(shù)據(jù)源的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06java-SSH2實(shí)現(xiàn)數(shù)據(jù)庫和界面的分頁
本文主要是介紹SSH2實(shí)現(xiàn)數(shù)據(jù)庫和界面的分頁的代碼,分頁在web應(yīng)用中是經(jīng)常要做的事情,實(shí)用性比較大,有需要的朋友可以來了解一下。2016-10-10解決RedisTemplate存儲(chǔ)至緩存數(shù)據(jù)出現(xiàn)亂碼的情況
這篇文章主要介紹了解決RedisTemplate存儲(chǔ)至緩存數(shù)據(jù)出現(xiàn)亂碼的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03SpringBoot超詳細(xì)講解Thymeleaf模板引擎
這篇文章主要分享了Spring Boot整合使用Thymeleaf,Thymeleaf是新一代的Java模板引擎,類似于Velocity、FreeMarker等傳統(tǒng)引擎,關(guān)于其更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-07-07