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 回答