2010-04-23 55 views
7

字節碼操作有什麼合法用途,以及人們在實踐中如何實現基於字節碼操作的解決方案?字節碼操作模式

更新:我應該更清楚地知道,這個問題實際上是關於人們使用什麼樣的模式和技術,通過字節碼操作來使代碼飛行。

類似於面向方面的編程已經提到或建立代理對象和類似的技術。

回答

8

字節碼操作,您可以實現任意複雜的(和有趣的)程序的轉換,如:

  • 入境/出境記錄代碼所選功能
  • 安全變換存根進出某些API的
  • API替代,例如,在測試工具中運行代碼。

範圍是無止境的;這只是一個小樣本。

至於這是如何通常完成,開始here

+0

也許我應該更清楚這一點。我已經知道這些庫,並且我知道Java是如何在字節碼級別上工作的。我真正想知道的是,人們發明了很多很酷的技術來做你不能做的事情,所以當我偶然發現這些問題時,我會考慮這些解決方案。 – ahe 2010-04-23 10:12:21

4

因此,可以讀取字節碼來實現解釋器/ JVM。當實現一個Java編譯器或一個編譯器來執行鍼對JVM的另一種語言(例如ScalaJython)時,可以編寫/生成字節碼。您可以執行字節碼操作來優化字節碼(如果您希望生產和銷售字節碼優化器,或者您需要它作爲內部工具來讓貴公司的代碼在競爭中脫穎而出)。以類似的方式,您可能會操縱字節碼以在分發之前對其進行混淆。您也可以執行aspect-oriented programming的字節碼操作;例如,您可能想要插入鉤子(可能用於計時或日誌記錄目的或出於某種其他原因),並且如果操作字節碼比編輯所有源文件更簡單或更便宜(例如可能是這種情況源代碼不可用或來自許多不同的來源,並非所有這些來源都可能在某人的控制之下,或者爲了說服這些團隊增加這樣的掛鉤可能是昂貴且耗時的),這可能是它會使將修改插入到最終的字節碼輸出中,而不是嘗試修改原始代碼(可能需要上游或維護單獨的分支,或從僅提供字節碼的第三方購買源代碼)。

儘管現在有許多現有的開源庫和框架可以操作,但您可以自己操作字節碼,包括BCELASM等等。

+0

「操縱字節碼比編輯所有源文件要便宜」 - 這是怎麼回事? – kgdinesh 2016-08-27 07:15:54

+1

@DineshBabu改寫,提供了一些例子來說明 – 2016-08-28 19:45:10

+0

謝謝,但字節碼操作是如何作爲設計模式出現的?如果我們從Java的領域走出來,並且總體上談論編程語言,並不是每個人都有這個特性。他們如何完成任務? – kgdinesh 2016-08-29 00:37:04

3

有一些論文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)。

0

某些框架(如BEA KODO(實現Java數據對象規範)使用字節碼操作來「增強」普通舊Java對象並基於XML描述添加持久性邏輯。

因此,數據庫映射信息然後在字節碼上自動生成。