Pregunta
¿Cómo puedo cambiar el nombre de las cosas utilizando BCEL? Hasta ahora lo que hago es ir a través de cada método en una clase y crear una nueva constante NameAndType en la piscina constante, entonces se sustituye la vieja constante NameAndType con que uno
int nameRef = cpg.addNameAndType(newName, m.getSignature());
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef));
Esta parece que debería funcionar, pero a mi me dice decompilador la piscina constante es corrupta después de esto. Me estoy perdiendo un paso o algo?
Solución
Usted está asumiendo que el ConstantPoolGen
es sólo una tabla de índices y valores. Pero yo creo que en realidad, tiene una estructura interna mucho más complicado. Mirando el método ConstantPoolGen
, es claro que también tiene referencias a objetos MethodGen
que puede o no me actualizados cuando se ejecuta el código.
Te aconsejo que no manipular la constante piscina directamente, sino a obtener cada método de la clase (como un objeto MethodGen
), y utiliza el método setName()
. La piscina constante se actualizará automáticamente.