java 动态转换器,Java 编程的动态性,第 5 部分: 动态转换类
Java 編程的動態(tài)性,第 5 部分: 動態(tài)轉(zhuǎn)換類
在經(jīng)過一段時間的休息之后,Dennis Sosnoski 又回來推出了他的
Java 編程的動態(tài)性
系
列的第 5 部分。您已在前面的文章中看到了如何編寫用于轉(zhuǎn)換 Java 類文件以改變代碼行為的程序。在本期中,Dennis將展示如何使用
Javassist
框架,把轉(zhuǎn)換與實(shí)際的類加載過程結(jié)合起來,用以進(jìn)行靈活的“即時”面向方面的特性處理。這種方法允許您決定想要在運(yùn)行時改變的內(nèi)容,并潛地在每次運(yùn)行程序
時做出不同的修改。在整個過程中,您還將更深入地了解向JVM 中加載類的一般問題。
在第 4 部分“
用 Javassist 進(jìn)行類轉(zhuǎn)換
”中,您學(xué)習(xí)了如何使用 Javassist 框架來轉(zhuǎn)換編譯器生成的
Java 類文件,同時寫回修改過的類文件。這種類文件轉(zhuǎn)換步驟對于做出持久變更是很理想的,但是如果想要在每次執(zhí)行應(yīng)用程序時做出不同的變更,這種方法就不一定很方便。對于這種暫時的變更,采用在您實(shí)際啟動應(yīng)用程序時起作用的方法要好得多。
JVM
體系結(jié)構(gòu)為我們提供了這樣做的便利途徑――通過使用 classloader 實(shí)現(xiàn)。通過使用 classloader
掛鉤(hook),您可以攔截將類加載到 JVM
中的過程,并在實(shí)際加載這些類之前轉(zhuǎn)換它們。為了說明這個過程是如何工作的,我將首先展示類加載過程的直接攔截,然后展示 Javassist
如何提供了一種可在您的應(yīng)用程序中使用的便利捷徑。在整個過程中,我將利用取自本系列以前文章中的代碼片斷。
不要錯過本系列的其余文章
第 1 部分,“
類和類裝入
”(2003 年 4 月)
第 2 部分,“
引入反射
”(2003 年 6 月)
第 3 部分,“
應(yīng)用反射
”(2003 年 7 月)
第 4 部分,“
用 Javassist 進(jìn)行類轉(zhuǎn)換
”(2003 年 9 月)
加載區(qū)域
運(yùn)行 Java 應(yīng)用程序的通常方式是作為參數(shù)向 JVM 指定主類。這對于標(biāo)準(zhǔn)操作沒有什么問題,但是它沒有提供及時攔截類加載過程的任何途徑,而這種攔截對大多數(shù)程序來說是很有用的。正如我在第
1 部分“
類和類裝入
”中所討論的,許多類甚至在主類還沒有開始執(zhí)行之前就已經(jīng)加載了。要攔截這些類的加載,您需要在程序的執(zhí)行過程中進(jìn)行某種程度的重定向。
幸運(yùn)的是,模擬 JVM 在運(yùn)行應(yīng)用程序的主類時所做的工作是相當(dāng)容易的。您所需做的就是使用反射(這是在不得
第
2 �
相關(guān)文檔:
哈哈,今天沒事做,但心情不錯,所以寫這篇文章.
類裝載器是Java程序運(yùn)行時不可缺少的一部分,它的任務(wù)是把由Java源程序編譯成的class文件讀入到內(nèi)存中,確切的說是裝入到JVM的內(nèi)存中,應(yīng)為JVM是一臺抽象的計(jì)算機(jī),它有著自己的CPU,內(nèi)存等. 在class文件中包含了一個類的各種信息,當(dāng)執(zhí)行java XXX命 ......
首先介紹?一款小巧的Java IDE - Gel
在《程序員》雜志2006年第4期看到介紹一篇介紹 Free Java IDE的文章,里面提到了Gel這個編譯器。于是上網(wǎng)搜了一下,果然找到了,官方網(wǎng)址是:http://memescape.co.uk/gexperts/。最新的版本是RC39,體積很小,安裝文件只 ......
一、final
根據(jù)程序上下文環(huán)境,Java關(guān)鍵字final有“這是無法改變的”或者“終態(tài)的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變:設(shè)計(jì)或效率。
final類不能被繼承,沒有子類,final類中的方法默認(rèn)是final的。
final方法不能被子類的方法覆蓋,但可� ......
項(xiàng)目中需要和第三方平臺接口,加了來源IP鑒權(quán)功能,測試時發(fā)現(xiàn)沒有問題,但是部署以后發(fā)現(xiàn)存在問題,一直鑒權(quán)不通過,一群人抓瞎。
我找到那塊的代碼,跟了一遍流程發(fā)現(xiàn)邏輯沒有啥問題,但是最終的結(jié)果卻還是鑒權(quán)不通過,實(shí)在有些詭異。其基本邏輯為先取得配置的IP列表,然后通過request.getRemoteAddr()取得客戶端的IP� ......
從本系列前面的文章中,您了解到反射的性能比直接訪問要慢許多倍,并了解了用 Javassist 和 Apache
Byte Code Engineering Library (BCEL)進(jìn)行classworking。Java 顧問 Dennis
Sosnoski 通過演示如何使用運(yùn)行時 classworking,來用全速前進(jìn)的生成代碼取代反射代碼,從而結(jié)束他的 Java 編程的動態(tài)性
系列。
既然您已經(jīng) ......
總結(jié)
以上是生活随笔為你收集整理的java 动态转换器,Java 编程的动态性,第 5 部分: 动态转换类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kindle3与亚马逊
- 下一篇: access 增加字段 工具_Java效