前言
在之前我們分析 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è)類是無(wú)法做到的,所以java提供了endorsed來(lái)達(dá)到你想要替換到系統(tǒng)中的類。
示例
修改java.util.arraylist
類中的 get(int index)
方法,在該方法中添加輸出獲取的值信息,如果是字符串直接輸出,如果不是則輸出類信息,及加載該元素類的classloader。代碼如下:
然后通過(guò)打包jar文件,放到一個(gè)目錄。
我這里是放到 “d:\endorsed” 該目錄下
測(cè)試類
1
2
3
4
5
6
7
8
9
|
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放到:
1
|
$java_home/jre/lib/endorsed |
這樣基于這個(gè)jdk的所有的arraylist都改變了?。。?/p>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。
原文鏈接:http://blog.csdn.net/jijianshuai/article/details/77620261