2010-12-12 19 views
2

Wie benenne ich Dinge mit BCEL? Bis jetzt, was ich tue, ist in einer Klasse durch jede Methode gehen und eine neue NameAndType Konstante im Konstanten-Pool erstellen, dann ersetze ich die alte NameAndType konstant mit, dass manUmbenennen von Dingen

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

Dies scheint, wie es funktionieren soll, aber meine Decompiler sagt mir, dass der konstante Pool danach beschädigt ist. Vermisse ich einen Schritt oder etwas?

Antwort

1

Sie gehen davon aus, dass ConstantPoolGen nur eine Tabelle mit Indizes und Werten ist. Aber ich glaube, dass es tatsächlich eine viel kompliziertere interne Struktur hat. Betrachtet man die ConstantPoolGen Methode, ist es klar, dass es auch Referenzen auf MethodGen Objekte enthält, die möglicherweise aktualisiert werden, wenn Sie Ihren Code ausführen.

Ich rate Ihnen, den Konstanten Pool nicht direkt zu manipulieren, sondern um jede Methode der Klasse (als MethodGen Objekt) zu erhalten, und verwenden Sie die Methode setName(). Der konstante Pool wird automatisch aktualisiert.

+0

Vielen Dank :) Jetzt muss ich nur eine Möglichkeit finden, alle Methodenverweise in anderen Klassen zu aktualisieren – Contra

+0

Sie können jede Invoke-Anweisung durchlaufen und ändern Sie ihren Methodennamen. Höchstwahrscheinlich wird die neue Methode zum Constant Pool hinzugefügt. Möglicherweise müssen Sie jedoch den CP manuell bereinigen, um den alten Methodennamen zu entfernen. –