2010-12-12 1 views
2

Comment renommer des objets avec BCEL? Jusqu'à présent, ce que je fais est passe par chaque méthode dans une classe et de créer une nouvelle constante de NameAndType dans la piscine constante, alors je remplace l'ancien NameAndType constant avec celuiRenommer des choses

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

Cela semble que cela devrait fonctionner, mais mon décompilateur me dit que le pool constant est corrompu après cela. Est-ce que je manque une étape ou quelque chose?

Répondre

1

Vous supposez que le ConstantPoolGen est juste un tableau d'indices et de valeurs. Mais je crois qu'en réalité, il a une structure interne beaucoup plus compliquée. En regardant la méthode ConstantPoolGen, il est clair qu'il contient aussi des références à MethodGen objets qui peuvent ou non me mis à jour lorsque vous exécutez votre code.

Je vous conseille de ne pas manipuler le pool constant directement, mais d'obtenir chaque méthode de la classe (en tant qu'objet MethodGen), et d'utiliser la méthode setName(). Le pool de constantes sera mis à jour automatiquement.

+0

Merci :) Maintenant, je dois juste trouver un moyen de mettre à jour toutes les références de méthode dans d'autres classes – Contra

+0

Vous pouvez passer en revue toutes les commandes invoke et changer le nom de la méthode. Très probablement, la nouvelle méthode sera ajoutée au pool constant. Toutefois, vous devrez peut-être nettoyer manuellement le CP pour supprimer l'ancien nom de la méthode. –