2011-12-13 97 views
3

我試圖圍繞這個概念包裹我的頭。我的問題是:Java字節碼注入

  1. 從性能的角度來看,這種操作代價高昂嗎?如果是這樣,爲什麼?
  2. 如果我試圖通過在調用方法後注入一些代碼來攔截一些傳遞給方法的參數,那麼每次調用該方法時會發生一次該注入還是發生這種情況?
  3. 此注入代碼位於何處?在應用程序源本身或其他地方?

回答

7

您可以使用Java代理實現字節碼注入。

java代理程序是一個庫,用於攔截在類加載器中加載的字節代碼,並在加載到JVM中之前對其進行增強。當然,這樣的庫通常依賴於字節碼操作庫,如Javassist,ASM或CGLib。 所以字節碼操作只能在類加載時執行一次。

看到官方的Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

本文介紹如何做幾乎你想要什麼: http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html

另外,如果你在字節碼的基本面很感興趣,本文從一個的JRebel開發者應該會很高興: http://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html

最後,你可以看看我剛剛寫的一個圖書館Seren。它是增強可序列化類的Java代理。這只是一個開始,但它的工作。 https://github.com/oliviercroisier/seren

+0

感謝您的回答,但您仍然沒有提供三個問題的答案。 – 2011-12-13 17:13:48