質問
BCELを使用して物事の名前を変更するにはどうすればよいですか?これまでのところ、私がしていることは、クラス内の各メソッドを実行し、定数プールに新しいnameandtype定数を作成することです。その後、古いnameandtype定数をその1つに置き換えます。
int nameRef = cpg.addNameAndType(newName, m.getSignature());
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef));
これは機能するはずのように思えますが、私の分解者は、この後に一定のプールが腐敗していると言っています。一歩か何かがありませんか?
解決
あなたはそれを仮定しています ConstantPoolGen
指標と値の単なるテーブルです。しかし、実際には、はるかに複雑な内部構造があると思います。を見ています ConstantPoolGen
方法、それが参照を保持していることは明らかです MethodGen
コードを実行したときに更新されたオブジェクト。
定数プールを直接操作するのではなく、クラスの各方法を取得することをお勧めします( MethodGen
オブジェクト)、およびメソッドを使用します setName()
. 。定数プールは自動的に更新されます。
所属していません StackOverflow