Sembrano quasi ridondanti nella funzionalità che ci offrono. La differenza principale sembra essere che quando abbiamo ridefinire una classe, forniamo un byte[]
con la nuova definizione fuori dal blu, mentre quando noi si ritrasmettono, otteniamo uno byte[]
contenente la definizione corrente tramite la stessa API, e noi restituire un byte[]
modificato.
Pertanto, per ridefinire, è necessario conoscere meglio la classe. Considerare il caso d'uso dell'iniezione di dichiarazioni di tracciamento di profilazione. Con ritrasmette puoi farlo più direttamente: basta guardare il bytecode dato, modificarlo e restituirlo. Ma se siamo passati alla route ridefinire, avremmo bisogno di recuperare l'originale byte[]
da qualche parte (come getResourceAsStream()
).
Un'altra differenza apparente riguarda il modo in cui interagiamo con altri trasformatori di classe; chi va per primo Le trasformazioni vengono applicate alla classe originale o ridefinita, quindi diverse trasformazioni possono essere additive, ad esempio.
Storicamente, se guardiamo le Dal commenti nel API documentation, o, a pagina 238 del this book (Friesen 2007 partire Java SE 6 Platform), notiamo che ridefinizione funzionalità sono state introdotte in Java 5, e di ritrasformazione in Java 6. La mia ipotesi è che la ritrasformazione sia stata introdotta come funzionalità più generale, ma la ridefinizione doveva essere mantenuta per compatibilità con le versioni precedenti.
Citando la frase chiave su ritrasformazione metodi dal libro legati sopra:
agenti utilizzano questi metodi per ritrasformare classi precedentemente caricate senza la necessità di accedere ai propri file di classe.
La seconda parte della domanda:
Se ridefinizione accade prima classe viene caricata e ritrasformazione dopo, poi, quando fa esattamente ritrasformazione accada?
No, la ridefinizione avviene dopo che la classe è stata caricata, oltre alla ritrasformazione. Accadono quando si chiamano i metodi redefineClasses(..)
edell'istanza, rispettivamente.
Ecco una domanda per gli esperti di passaggio: c'è qualcosa che si può fare da ridefinendo classi, che non si può fare da ritrasformandosi loro? La mia ipotesi è che la risposta sia "nulla".