2

BCEL を使用して名前を変更するにはどうすればよいですか? これまでのところ、クラスの各メソッドを調べて、定数プールに新しい NameAndType 定数を作成し、古い NameAndType 定数をその定数に置き換えます。

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

これは機能するはずですが、私の逆コンパイラは、この後、定数プールが壊れていることを教えてくれます。ステップか何かが欠けていますか?

4

1 に答える 1

1

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

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

于 2010-12-12T11:12:19.220 に答える