如何使用BCEL重命名内容?到目前为止,我要做的就是通过班级中的每种方法,并在常数池中创建一个新的nameandtype常数,然后我用一个旧的nameandtype常数替换为

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

这似乎应该可以工作,但是我的分解器告诉我,在此之后,恒定的池是腐败的。我错过了一步吗?

有帮助吗?

解决方案

您假设 ConstantPoolGen 只是索引和值表。但是我相信实际上,它具有更复杂的内部结构。看着 ConstantPoolGen 方法,很明显,它也有参考 MethodGen 运行代码时可能会更新的对象。

我建议您不要直接操纵恒定池,而是要获得班级的每种方法(作为一个 MethodGen 对象),并使用该方法 setName(). 。恒定池将自动更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top