2010-12-12 27 views
2

BCELを使用して名前を変更するにはどうすればよいですか?これまでのところ私は何をすべきか、それは動作しますが、私の逆コンパイラをすべきであるように、私はこれが思われる1名前を変更する

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

と一定の古いNameAndTypeを置き換える、クラス内の各メソッドを通過し、一定のプールに新しいNameAndType定数を作成することですこの後一定のプールが壊れていると私に伝えます。私はステップや何かを欠いていますか?

答えて

1

ConstantPoolGenはインデックスと値の単なるテーブルであると仮定しています。しかし、私は実際には、それははるかに複雑な内部構造を持っていると信じています。 ConstantPoolGenメソッドを見ると、コードを実行するときに更新される可能性のあるMethodGenオブジェクトへの参照も保持されていることは明らかです。

定数プールを直接操作するのではなく、クラスの各メソッド(MethodGenオブジェクト)を取得し、メソッドsetName()を使用することをお勧めします。定数プールは自動的に更新されます。

+0

ありがとうございました:)今は、他のクラスのすべてのメソッド参照を更新する方法を理解するだけです。 – Contra

+0

すべての呼び出しステートメントを調べて、そのメソッド名を変更できます。ほとんどの場合、新しいメソッドが定数プールに追加されます。ただし、手動でCPをクリーンアップして古いメソッド名を削除する必要があります。 –

関連する問題