重命名的东西

时间:2010-12-12 04:55:37

标签: java bcel

如何使用BCEL重命名?到目前为止,我所做的是遍历类中的每个方法并在常量池中创建一个新的NameAndType常量,然后我用那个替换旧的NameAndType常量

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

这似乎应该可行,但我的反编译器告诉我此后常量池已损坏。我错过了一步还是什么?

1 个答案:

答案 0 :(得分:1)

您假设ConstantPoolGen只是一个索引和值表。但我相信实际上,它的内部结构要复杂得多。查看ConstantPoolGen方法,很明显它还包含对MethodGen个对象的引用,这些对象可能会在您运行代码时更新。

我建议你不要直接操作常量池,而是要获取类的每个方法(作为MethodGen对象),并使用方法setName()。常量池将自动更新。