我們目前使用premain在所有的類加載之前進行轉換。 但是我們想要控制轉換,這意味着我們可以刪除/重新添加我們在方法中插入的代碼。加載後我們可以重新轉換類嗎?
所以我們發現了轉換,但我不是很理解它。
- 我們可以重新轉換加載類嗎?
- 如果可以完成,重新轉換類的實例是否會運行重新轉換後的代碼?
- 如果無法完成,是否有任何技術可以在運行時更改某些指定方法的代碼。
修訂
例如,我們有A級類A有兩個方法foo()和bar():
void foo() {
while(true) {
bar();
}
}
void bar() {
System.out.println("a");
}
我們稱之爲Instrument.retransformClasses(一類)。和更改欄()來:
void bar() {
System.out.println("b");
}
如果有一個線程調用已經FOO(),我們可以有輸出:
...
a
a
a
b
b
b
...
如果沒有,有沒有什麼辦法來實現呢?
「變形」是什麼意思? – byxor
[在運行時更新Java代碼]的可能副本(http://stackoverflow.com/questions/3079280/update-java-code-during-runtime) – Blobonat
我們當前實現了一個ClassFileTransformer來在每個類的方法中插入一些代碼有一個特殊的註釋。根據我的理解,轉換正在改變類的字節碼(至少,它看起來像改變字節碼,根據ClassFileTransformer#transform()的javadoc)。 –