在構(gòu)建可擴(kuò)展的服務(wù)器端應(yīng)用程序時(shí),我們會(huì)花費(fèi)大量時(shí)間思考如何在生產(chǎn)中監(jiān)控、操作和更新代碼。一種新的工具已經(jīng)發(fā)展起來,可以幫助Java開發(fā)人員做到這一點(diǎn)。它們中的許多都是建立在外部代碼可以在運(yùn)行時(shí)與JVM集成的最強(qiáng)大的方式之一Java代理上的。如果你也對(duì)java感興趣,不妨報(bào)個(gè)java培訓(xùn)班,有專業(yè)講師面授指導(dǎo)教學(xué),還有更加系統(tǒng)全面的課程,讓學(xué)習(xí)更科學(xué),更有效。
代理是操作系統(tǒng)本機(jī)或Java庫(kù)(我們將在下面描述它們的區(qū)別),JVM為這些庫(kù)提供了普通應(yīng)用程序代碼無法使用的功能。為了了解這些工具的基礎(chǔ)性,讓我們看看我們使用的一些依賴它們的工具:
l 探查器使用Java代理修改目標(biāo)框架的代碼,以注入收集性能指標(biāo)的新代碼。這包括獨(dú)立服務(wù)或托管服務(wù),如NewRelic或YourKit。
l JRebel通過構(gòu)建一種技術(shù)將其提升到了一個(gè)新的水平,該技術(shù)可以在運(yùn)行時(shí)提供平滑的類熱交換,而無需重新啟動(dòng)JVM。
l Play框架使用Java代理在運(yùn)行時(shí)實(shí)現(xiàn)類的熱交換。
l 在Harness,我們利用JVM向本機(jī)代理提供的低級(jí)功能來顯示導(dǎo)致錯(cuò)誤的實(shí)際源代碼和變量值。
Java代理
Java代理是.jar文件,它定義了一個(gè)特殊的premain靜態(tài)函數(shù),JVM將在調(diào)用應(yīng)用程序的主函數(shù)之前調(diào)用該函數(shù)。神奇的部分來自Instrumentation對(duì)象,它作為參數(shù)由主機(jī)JVM傳遞給這個(gè)函數(shù)。通過抓住這個(gè)對(duì)象,代理的代碼(在其他方面表現(xiàn)為根類加載器加載的任何Java代碼)可以做一些非常強(qiáng)大的事情。在java培訓(xùn)中,無論是理論知識(shí),還是實(shí)戰(zhàn)項(xiàng)目,都是緊跟市場(chǎng)和企業(yè)需求的,讓你掌握最新技術(shù),走在市場(chǎng)前沿。
他們做什么
給予代理的最強(qiáng)大的能力是在運(yùn)行時(shí)類中動(dòng)態(tài)重寫目標(biāo)類的方法內(nèi)容的能力(字段結(jié)構(gòu)是不可變的)。這個(gè)過程稱為字節(jié)碼插裝,它使代理能夠在代碼運(yùn)行時(shí)重寫方法的內(nèi)容。
一些例子包括添加對(duì)特定方法的調(diào)用來分析性能(例如end time–start time)或記錄參數(shù)值(例如傳遞給servlet的URL)。另一個(gè)例子是在不重啟JVM的情況下重新加載一個(gè)新版本的類,就像JRebel所做的那樣。
這是怎么做到的
對(duì)于代理來說,修改代碼或加載的類實(shí)際上觸發(fā)了JVM重新加載類的過程,其中類的字節(jié)碼被替換為新版本。這要求代理能夠向JVM提供可驗(yàn)證的新字節(jié)碼(即符合JVM規(guī)范)。不幸的是,在運(yùn)行時(shí)生成正確的字節(jié)碼并不簡(jiǎn)單——有很多需求和邊緣情況。為此,代理通常使用庫(kù)來讀寫字節(jié)碼。該庫(kù)使他們能夠?qū)F(xiàn)有類的字節(jié)碼加載到一個(gè)類似DOM的結(jié)構(gòu)中,通過添加諸如分析調(diào)用之類的東西來修改它,然后將DOM保存回原始字節(jié)碼。想了解有關(guān)java更多詳細(xì)信息,建議參加Java培訓(xùn),通過系統(tǒng)全面的學(xué)習(xí),可以快速提升自己。
?
ASM是一個(gè)流行的庫(kù),它提供了一個(gè)通用的Java字節(jié)碼操作和分析框架。這是最流行的字節(jié)碼操作庫(kù)之一,可以用來修改現(xiàn)有的類或者直接以二進(jìn)制形式動(dòng)態(tài)生成類。它非常流行,以至于Sun的一些內(nèi)部代碼實(shí)際上使用它來解析Java中的字節(jié)碼。
最后的想法
了解什么是代理以及它們是如何構(gòu)建的是有好處的,因?yàn)榧词鼓阕罱K沒有編寫一個(gè)代理,你今天也可能會(huì)依賴其中的一個(gè)或多個(gè)來驅(qū)動(dòng)你的應(yīng)用程序。如果你也打算從事java行業(yè),可以參加java培訓(xùn)來提升自己,有老師帶你快速入門,很快就能掌握java知識(shí)和技能。