Domanda
Come faccio a rinominare le cose usando BCEL? Finora quello che faccio è andare attraverso ogni metodo in una classe e creare una nuova costante NameAndType in piscina costante, allora si sostituisce la vecchia costante NameAndType con quella
int nameRef = cpg.addNameAndType(newName, m.getSignature());
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef));
Questo sembra che dovrebbe funzionare, ma il mio decompilatore mi dice che il pool di costanti è danneggiato dopo questo. Mi manca un passo o qualcosa del genere?
Soluzione
Si sta assumendo che la ConstantPoolGen
è solo una tabella di indici e valori. Ma io credo che in realtà, ha una struttura interna molto più complicato. Guardando il metodo ConstantPoolGen
, è chiaro che essa detiene anche i riferimenti agli oggetti MethodGen
che può o non mi aggiornati quando si esegue il codice.
Vi consiglio di non manipolare il costante Pool direttamente, ma per ottenere ogni metodo della classe (come un oggetto MethodGen
), e utilizza il metodo setName()
. La piscina costante sarà aggiornato automaticamente.