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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top