题
如何使用BCEL重命名内容?到目前为止,我要做的就是通过班级中的每种方法,并在常数池中创建一个新的nameandtype常数,然后我用一个旧的nameandtype常数替换为
int nameRef = cpg.addNameAndType(newName, m.getSignature());
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef));
这似乎应该可以工作,但是我的分解器告诉我,在此之后,恒定的池是腐败的。我错过了一步吗?
解决方案
您假设 ConstantPoolGen
只是索引和值表。但是我相信实际上,它具有更复杂的内部结构。看着 ConstantPoolGen
方法,很明显,它也有参考 MethodGen
运行代码时可能会更新的对象。
我建议您不要直接操纵恒定池,而是要获得班级的每种方法(作为一个 MethodGen
对象),并使用该方法 setName()
. 。恒定池将自动更新。
不隶属于 StackOverflow