久久一区二区三区超碰国产精品,亚洲人成在线网站,国产在线精品一区免费香蕉,国产精品免费电影

歡迎您訪問利用 Java.lang.instrument 實(shí)現(xiàn)動(dòng)態(tài) Instrumentation 的新特性!

利用 Java.lang.instrument 實(shí)現(xiàn)動(dòng)態(tài) Instrumentation 的新特性

更新時(shí)間:2024-06-07 07:16:38作者:佚名

0 簡(jiǎn)介

使用java.lang.進(jìn)行動(dòng)態(tài)操作是Java SE 5的新特性,它將Java函數(shù)從本地代碼中解放出來,讓Java代碼能夠自己解決問題。有了它,開發(fā)人員可以構(gòu)建獨(dú)立于應(yīng)用程序的代理,來監(jiān)控和協(xié)助運(yùn)行在JVM上的程序,甚至可以替換和修改某些類的定義。有了該功能,開發(fā)人員可以實(shí)現(xiàn)更加靈活的運(yùn)行時(shí)虛擬機(jī)監(jiān)控和Java類操作。該功能實(shí)際上提供了一種虛擬機(jī)級(jí)別支持的AOP實(shí)現(xiàn)方法,開發(fā)人員可以在不升級(jí)或更改JDK的情況下實(shí)現(xiàn)某些AOP功能。

在Java SE 6中,包被賦予了更強(qiáng)大的功能:后啟動(dòng)、本地代碼、動(dòng)態(tài)變化等等,這些改變意味著Java擁有了更強(qiáng)的動(dòng)態(tài)控制和解釋能力,使得Java語言變得更加靈活多變。

在Java SE6中,最大的改變使得運(yùn)行時(shí)成為可能。在Java SE 5中,需要在運(yùn)行前使用命令行參數(shù)或者系統(tǒng)參數(shù)設(shè)置代理類。在實(shí)際運(yùn)行中,在虛擬機(jī)初始化的時(shí)候(大多數(shù)Java類庫(kù)加載之前),就會(huì)啟動(dòng)代理類的設(shè)置,并在虛擬機(jī)中設(shè)置一個(gè)回調(diào)函數(shù)來檢測(cè)具體類的加載情況并完成實(shí)際的工作。但在很多實(shí)際情況下,我們沒有辦法在虛擬機(jī)啟動(dòng)的時(shí)候就為其設(shè)置代理,這其實(shí)限制了應(yīng)用。Java SE 6的新特性改變了這種情況,通過Java Tool API中的方法,我們可以很方便地在運(yùn)行過程中動(dòng)態(tài)地設(shè)置加載代理類,達(dá)到目的。

此外,接口訪問也是Java SE 6的一個(gè)全新特性,它使得以前不可能實(shí)現(xiàn)的功能——接口訪問可以在Java SE 6中通過一個(gè)或者一系列的添加來完成。

最后,Java SE 6 中添加了動(dòng)態(tài)添加類路徑的功能。所有這些新特性使得包的功能更加強(qiáng)大,從而使 Java 語言本身更加強(qiáng)大。

1 基本功能及使用方法

JVMTI(Java Tool)是Java虛擬機(jī)為JVM相關(guān)工具提供的一套原生編程接口。JVMTI在Java SE 5中被引入,整合并取代了之前使用的Java(JVMPI)和Java Debug(JVMDI)。在Java SE 6中instrument是什么意思,JVMPI和JVMDI已經(jīng)消失。JVMTI提供了一套“代理”程序機(jī)制,可以支持第三方工具程序以代理的方式連接并訪問JVM,并利用JVMTI提供的豐富編程接口完成很多JVM相關(guān)的功能。

其實(shí)java.lang.包的實(shí)現(xiàn)就是基于這種機(jī)制的:在實(shí)現(xiàn)中有一個(gè)JVMTI代理,通過調(diào)用JVMTI中Java類相關(guān)的函數(shù)來完成Java類的動(dòng)態(tài)操作。除了上述函數(shù)之外,JVMTI還在虛擬機(jī)內(nèi)存管理、線程控制、方法和變量操作等方面提供了大量有價(jià)值的函數(shù)。

1.1 VM 預(yù)啟動(dòng)設(shè)置

最大的作用就是可以動(dòng)態(tài)的改變和操作類定義,在Java SE 5以及后續(xù)版本中,開發(fā)者可以在普通的Java程序(有main函數(shù)的Java類)運(yùn)行時(shí),通過--參數(shù)指定具體的jar文件(包含代理)來啟動(dòng)代理程序。

功能比較強(qiáng)大,可以批量轉(zhuǎn)換很多類別。

1.2 VM啟動(dòng)后動(dòng)態(tài)

在Java SE 5中,開發(fā)者只能發(fā)揮自己的想象力,所能做的事情僅限于在main函數(shù)執(zhí)行之前,這種方式有一定的局限性。

Java SE 6 在Java SE 5的基礎(chǔ)上對(duì)此情況進(jìn)行了改進(jìn),開發(fā)者可以在main函數(shù)開始執(zhí)行后,啟動(dòng)自己的程序。

在 Java SE 6 中,有一種名為“手拉手運(yùn)行”的方法,可以在主函數(shù)開始運(yùn)行后運(yùn)行。就像函數(shù)一樣,開發(fā)人員可以編寫一個(gè)包含“”函數(shù)的 Java 類:

類似地,[1] 的優(yōu)先級(jí)高于 [2],將首先執(zhí)行。與函數(shù)一樣,開發(fā)人員可以對(duì)類進(jìn)行各種操作。和 Inst 的用法相同。

與“-Class”類似,開發(fā)人員必須在文件中設(shè)置“Agent-Class”來指定包含該功能的類。

但不同的是,它需要在main函數(shù)開始運(yùn)行之后才啟動(dòng),這樣的時(shí)機(jī)該如何確定,又該如何實(shí)現(xiàn)這樣的功能呢?

在 Java SE 6 的文檔中,開發(fā)者可能無法在與 java.lang. 包相關(guān)的文檔部分看到清晰的介紹,更不用說具體的應(yīng)用示例了。然而,在 Java SE 6 的眾多新特性中,卻有一個(gè)不顯眼的地方透露了用法。這就是 Java SE 6 中提供的 API。

該API并非標(biāo)準(zhǔn)的Java API,而是Sun提供的用于將代理工具程序“附加”到目標(biāo)JVM的擴(kuò)展API,通過它,開發(fā)人員可以方便地監(jiān)控JVM并運(yùn)行附加的代理程序。

1.3 本地方法

在JDK 1.5版本中,沒有辦法處理Java本機(jī)方法()留學(xué)之路,而在Java標(biāo)準(zhǔn)JVMTI下也沒有辦法改變它,這使替換本機(jī)方法變得非常困難。一個(gè)更直接簡(jiǎn)單的想法是在啟動(dòng)時(shí)替換本機(jī)代碼所在的動(dòng)態(tài)鏈接庫(kù)——但這本質(zhì)上是靜態(tài)替換,而不是動(dòng)態(tài)替換。而且,這可能需要編譯大量的動(dòng)態(tài)鏈接庫(kù)——比如我們有三個(gè)本機(jī)函數(shù),假設(shè)每一個(gè)都需要替換,而不同的應(yīng)用程序可能需要不同的組合。如果我們將三個(gè)函數(shù)都編譯在同一個(gè)動(dòng)態(tài)鏈接庫(kù)中,則將需要多達(dá)8個(gè)不同的動(dòng)態(tài)鏈接庫(kù)才能滿足需求。當(dāng)然instrument是什么意思,我們也可以獨(dú)立編譯它們,這也需要6個(gè)動(dòng)態(tài)鏈接庫(kù)——無論如何,這種繁瑣的方法是不可接受的。

在Java SE 6中,為了解決一些問題,提出了一種新的代碼解析方式作為原有解析方式的補(bǔ)充。也就是說,在新版本的java.lang.包中,我們多了一種代碼方法——。

假設(shè)我們有一個(gè)名為 的函數(shù),在執(zhí)行過程中,需要將其指向另外一個(gè)函數(shù)(需要注意的是,在目前的標(biāo)準(zhǔn) JVMTI 下,除了函數(shù)名不同,其他都需要保持一致)。例如我們的 Java 代碼為:

是不是很有趣呢?所以如果我們要做類似的工作,一個(gè)好的建議是先用Java寫一個(gè)接口,用javah工具生成一個(gè)c文件,看看它實(shí)際解析的函數(shù)名是什么,這樣就可以避免一些不必要的麻煩。

另一個(gè)事實(shí)是,與我們想象的不一樣,對(duì)于兩個(gè)或更多個(gè),虛擬機(jī)不會(huì)進(jìn)行更多解析;它不會(huì)嘗試刪除一個(gè),然后組裝函數(shù)接口。它會(huì)且只進(jìn)行兩次解析。

總之,新的方式改變了Java中代碼不能動(dòng)態(tài)改變的弊端。目前使用JNI編寫代碼也是Java應(yīng)用中很重要的一個(gè)部分,所以它的動(dòng)態(tài)性就意味著整個(gè)Java都可以動(dòng)態(tài)改變——現(xiàn)在我們的代碼可以使用plus來動(dòng)態(tài)改變函數(shù)指針了。如上所說,如果找不到,虛擬機(jī)就會(huì)嘗試做標(biāo)準(zhǔn)分析,這就給我們提供了一種動(dòng)態(tài)替換代碼的方法。我們可以把很多不同的函數(shù)編譯成一個(gè)動(dòng)態(tài)鏈接庫(kù),通過封裝的功能,讓函數(shù)像Java函數(shù)一樣動(dòng)態(tài)地改變和替換。當(dāng)然現(xiàn)在還是有一些限制的,比如不同的會(huì)各有各的,也就是各自負(fù)責(zé)他替換的所有類,而不是某個(gè)具體的類——所以這個(gè)粒度可能不夠精確。

1.4 / 動(dòng)態(tài)添加

我們知道,通過設(shè)置系統(tǒng)參數(shù)或者虛擬機(jī)啟動(dòng)參數(shù),我們可以設(shè)置虛擬機(jī)運(yùn)行時(shí)啟動(dòng)時(shí)的一個(gè)類加載路徑(-)和類加載路徑(-cp),當(dāng)然運(yùn)行后我們無法替換它。但是,有時(shí)候我們需要加載一些jar包進(jìn)去,就不能應(yīng)用上面兩種方法了;或者需要在虛擬機(jī)啟動(dòng)后再加載一些jar包進(jìn)去。在Java SE 6中,我們可以這樣做。

要實(shí)現(xiàn)這幾點(diǎn)其實(shí)很簡(jiǎn)單,首先我們還是需要確認(rèn)虛擬機(jī)已經(jīng)支持這個(gè)功能,然后添加所需的/,我們可以在 our 中使用 / 來完成這個(gè)任務(wù)。

同時(shí)我們可以注意到,在代理中添加Boot-Class-Path,其實(shí)可以在動(dòng)態(tài)加載代理的同時(shí),添加自己的引導(dǎo)類路徑。當(dāng)然,在Java代碼中可以更動(dòng)態(tài)、更方便、更智能地完成——我們可以很方便地添加判斷和選擇組件。

這里我們還需要注意幾點(diǎn):

首先,我們添加的jar文件中不應(yīng)該包含任何與系統(tǒng)相關(guān)的同名類,否則,一切都將變得不可預(yù)測(cè)——這不是一個(gè)工程師想要的結(jié)果,對(duì)吧?

其次我們要注意虛擬機(jī)的工作方式,它會(huì)把解析的結(jié)果記錄下來,比如我們?cè)?jīng)要求讀取某個(gè)類,但是失敗了,它就會(huì)記住這件事,即使我們后面動(dòng)態(tài)添加了一個(gè)包含這個(gè)類的jar,它還是會(huì)認(rèn)為我們無法解析這個(gè)類,會(huì)報(bào)上次一樣的錯(cuò)誤。

再次,我們知道Java語言中有一個(gè)系統(tǒng)參數(shù)“java.class.path”,這個(gè)參數(shù)記錄了我們當(dāng)前的,但是雖然我們用這兩個(gè)函數(shù)來實(shí)際改變實(shí)際的,但是對(duì)這個(gè)本身不會(huì)產(chǎn)生任何影響。

在 包中我們可以發(fā)現(xiàn)一個(gè)很有意思的東西,Sun 的設(shè)計(jì)者告訴我們這個(gè)函數(shù)其實(shí)依賴于一個(gè)方法——這是一個(gè)非 函數(shù),所以我們不建議直接使用它(使用反射等)。其實(shí)包中的兩個(gè)函數(shù)已經(jīng)可以很好的解決我們的問題了。

1.5 META-INF/.MF 列表

以下是代理 jar 文件的列表:

推薦公眾賬號(hào):

為您推薦

士兵的追求與堅(jiān)持:道歉與保護(hù),永不退縮

run.軍人不會(huì)逃跑你跟所有戰(zhàn)士都有著同樣的追求soldier.soldier.你現(xiàn)在卻要解雇員工里全部的退伍軍人it.現(xiàn)在已經(jīng)有三個(gè)人為此喪命了但一個(gè)士兵受傷會(huì)拖累全隊(duì)看看我們能否讓他的長(zhǎng)官開竅以上參考資料就是本詞典詳細(xì)匯總的詞語soldier是什么意思的翻譯解釋,如有錯(cuò)漏請(qǐng)向我們提供反饋意見。

2024-06-05 14:13

accommodation意思 哈爾濱冰雪節(jié)爆火!國(guó)外網(wǎng)站如何介紹?值得學(xué)

accommodation意思其實(shí)哈爾濱的爆火也是經(jīng)歷了一番醞釀的,冰雪旅游近幾年就十分受歡迎,北京冬奧會(huì)之后更是持續(xù)升溫。網(wǎng)站介紹了哈爾濱的冰雪節(jié),文章的語言、結(jié)構(gòu)、內(nèi)容都值得學(xué)習(xí),和大家一起看一下。哈爾濱國(guó)際冰雪節(jié)使這座城市成為旅游愛好者和攝影者夢(mèng)寐以求的勝地。哈爾濱國(guó)際冰雪節(jié)使這座城市成為旅游愛好者和攝影者夢(mèng)寐以求的勝地。

2024-06-04 19:09

溫哥華英文教練:C 字母的歷史淵源與英文表達(dá)中的聯(lián)系

正由于有這樣的歷史淵源,C字母進(jìn)入英文后,與g,k發(fā)音和拼寫都有千絲萬縷的聯(lián)系。在英文中,跟這個(gè)詞根相關(guān)的詞還不少,比如carnival(狂歡節(jié)。這個(gè)詞來自于法語,意思是“陳詞濫調(diào)”,原為印刷術(shù)語,與stereotype相通,即“凸印版、印刷版、鉛版”。進(jìn)入英文單詞中的匈牙利語不多,這個(gè)詞算一個(gè)。

2024-06-04 17:50

想要驚艷又好聽的英文名?快來看看這些獨(dú)特的男生英文名吧

男生用此英文名,聰明機(jī)敏的氣質(zhì)中透露著一絲霸氣。意思是“討人喜歡”,簡(jiǎn)單大方,男女都可以用。“rabia”的本義指的是“早春的植物”,女孩取這個(gè)作為英文名字,富有滿滿的生命力,有種清新自然的感覺,且源自于阿拉伯語和非洲語,比較小眾,趁還沒有流行起來,趕快拿走吧!

2024-06-04 11:38

英語名詞考點(diǎn)完全歸納:普通名詞與專有名詞的區(qū)別及用法

英語名詞考點(diǎn)完全歸納名詞的所有格知識(shí)點(diǎn)整理英語名詞知識(shí)點(diǎn)歸納英語的普通名詞根據(jù)其語法性質(zhì),又可以細(xì)為個(gè)體名詞、物質(zhì)名詞、集合名詞和抽象名詞四類。將語法知識(shí)與生活常識(shí)結(jié)合考查還有些名詞考題與語法知識(shí)相關(guān)性不大,而是純粹地考查考生的生活常識(shí)。

2024-06-04 09:37

四六級(jí)寫作部分解題秘籍:隱藏歡樂比隱藏悲痛更了不起

寫作部分解題秘籍在閱卷過程中,閱卷老師一般先根據(jù)作文結(jié)構(gòu)給出基本分,然后根據(jù)用詞和句式方面的好壞進(jìn)行加減分。通過分析近十年的四六級(jí)高分作文,我們歸納出了四六級(jí)作文首段常用的寫作方法。特殊句式是英語寫作的重點(diǎn)和難點(diǎn)。

2024-06-04 08:28

加載中...
主站蜘蛛池模板: 正镶白旗| 仪陇县| 朝阳县| 井研县| 营山县| 平山县| 巴南区| 阿合奇县| 栾城县| 徐水县| 丽水市| 新民市| 江陵县| 青浦区| 马边| 桓台县| 新昌县| 三原县| 凭祥市| 亳州市| 财经| 富阳市| 来凤县| 萨迦县| 额济纳旗| 莫力| 涞源县| 贵南县| 灵台县| 龙陵县| 岳西县| 宁武县| 沙河市| 宝坻区| 南丹县| 嵊泗县| 盐城市| 石林| 普陀区| 岚皋县| 迁安市|