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

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


这似乎应该工作,但是我的反编译器告诉我,此后常量池已损坏。我错过了一步吗?

最佳答案

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

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

关于java - 重命名事物,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4420452/

10-12 14:51