Java 重新命名事物

Java 重新命名事物,java,bcel,Java,Bcel,如何使用BCEL重命名对象?到目前为止,我所做的是遍历类中的每个方法,并在常量池中创建一个新的NameAndType常量,然后用该常量替换旧的NameAndType常量 int nameRef = cpg.addNameAndType(newName, m.getSignature()); cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef)); 这似乎应该可以工作,但我的反编译器告诉我常量池在此之后已损坏。我遗漏了一个步骤还是什

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

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

这似乎应该可以工作,但我的反编译器告诉我常量池在此之后已损坏。我遗漏了一个步骤还是什么?

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


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

谢谢:)现在我只需要找出一种方法来更新其他类中的所有方法引用。您可以遍历每个invoke语句并更改其方法名称。新方法很可能会添加到常量池中。但是,您可能必须手动清理CP以删除旧方法名。