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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top