字節碼操作有什麼合法用途,以及人們在實踐中如何實現基於字節碼操作的解決方案?字節碼操作模式
更新:我應該更清楚地知道,這個問題實際上是關於人們使用什麼樣的模式和技術,通過字節碼操作來使代碼飛行。
類似於面向方面的編程已經提到或建立代理對象和類似的技術。
字節碼操作有什麼合法用途,以及人們在實踐中如何實現基於字節碼操作的解決方案?字節碼操作模式
更新:我應該更清楚地知道,這個問題實際上是關於人們使用什麼樣的模式和技術,通過字節碼操作來使代碼飛行。
類似於面向方面的編程已經提到或建立代理對象和類似的技術。
字節碼操作,您可以實現任意複雜的(和有趣的)程序的轉換,如:
範圍是無止境的;這只是一個小樣本。
至於這是如何通常完成,開始here。
因此,可以讀取字節碼來實現解釋器/ JVM。當實現一個Java編譯器或一個編譯器來執行鍼對JVM的另一種語言(例如Scala和Jython)時,可以編寫/生成字節碼。您可以執行字節碼操作來優化字節碼(如果您希望生產和銷售字節碼優化器,或者您需要它作爲內部工具來讓貴公司的代碼在競爭中脫穎而出)。以類似的方式,您可能會操縱字節碼以在分發之前對其進行混淆。您也可以執行aspect-oriented programming的字節碼操作;例如,您可能想要插入鉤子(可能用於計時或日誌記錄目的或出於某種其他原因),並且如果操作字節碼比編輯所有源文件更簡單或更便宜(例如可能是這種情況源代碼不可用或來自許多不同的來源,並非所有這些來源都可能在某人的控制之下,或者爲了說服這些團隊增加這樣的掛鉤可能是昂貴且耗時的),這可能是它會使將修改插入到最終的字節碼輸出中,而不是嘗試修改原始代碼(可能需要上游或維護單獨的分支,或從僅提供字節碼的第三方購買源代碼)。
字節碼操作的一種用法是aspect oriented programming。在Java中,您可以使用AspectJ。
有一些論文Patterns of Aspect-Oriented Design(PDF)和Aspect-Oriented Design Principles: Lessons from Object-Oriented Design(PDF),它們描述了AOP /字節碼操作的一些模式。
就我個人而言,我使用ASM的的字節碼操作來爲使用該框架的類生成一些樣板代碼。該框架需要客戶端代碼的自定義equals()和hashCode()方法,所以我通過掛接Java Agent來修改字節碼,因爲ClassLoader會加載這些類。我也多次使用CGLIB來產生動態代理(如果這算作AOP)。
某些框架(如BEA KODO(實現Java數據對象規範)使用字節碼操作來「增強」普通舊Java對象並基於XML描述添加持久性邏輯。
因此,數據庫映射信息然後在字節碼上自動生成。
也許我應該更清楚這一點。我已經知道這些庫,並且我知道Java是如何在字節碼級別上工作的。我真正想知道的是,人們發明了很多很酷的技術來做你不能做的事情,所以當我偶然發現這些問題時,我會考慮這些解決方案。 – ahe 2010-04-23 10:12:21