2010-12-12 40 views
2

如何使用BCEL重命名事物?到目前爲止,我所要做的就是去完成每一種方法的類和常量池中創建一個新的NameAndType常數,那麼我取代舊NameAndType與一個重命名事物

int nameRef = cpg.addNameAndType(newName, m.getSignature()); 
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef)); 

這似乎不斷像它應該工作,但我反編譯告訴我這個常量池在這之後是腐敗的。我錯過了一個步驟或什麼?

回答

1

你認爲ConstantPoolGen只是一個索引和值的表。但我相信實際上,它有更復雜的內部結構。看看ConstantPoolGen方法,很明顯它還保存對MethodGen對象的引用,當您運行代碼時可能會更新或不更新對象。

我建議你不要直接操作常量池,而是要獲得該類的每種方法(作爲MethodGen對象),並使用方法setName()。常量池將自動更新。

+0

謝謝:)現在我只需要找出一種方法來更新其他類中的所有方法引用 – Contra 2010-12-13 02:25:32

+0

您可以通過每個調用語句並更改其方法名稱。很可能新方法將被添加到常量池中。但是,您可能需要手動清理CP才能刪除舊的方法名稱。 – 2010-12-13 11:28:28