2010-04-23 19 views
7

Quali usi legittimi ci sono per la manipolazione del bytecode e in che modo le persone implementano tali soluzioni basate sulla manipolazione del codice byte in pratica?Pattern di manipolazione del codice byte

Aggiornamento: avrei reso più chiaro che questa domanda è in realtà di ciò che modelli e tecniche la gente usa per rendere il loro codice di volare con l'aiuto di manipolazione bytecode.

Qualcosa come la programmazione orientata all'aspetto che è stata già menzionata o la costruzione di oggetti proxy al volo e tecniche simili.

risposta

8

manipolazione Bytecode consente di implementare arbitrariamente complesse (e interessanti) trasformazioni di programma, ad esempio:

  • inserimento codice/registrazione uscita per funzioni selezionate
  • trasformazioni di sicurezza che spegnere l'accesso a determinate API
  • Sostituzione API per, ad esempio, esecuzione di codice in un'imbracatura di test.

Lo scopo è infinito; questo è solo un piccolo campionamento.

Per quanto riguarda il modo in cui si esegue in genere, avviare here.

+0

Forse avrei dovuto essere più chiaro su questo. Conosco già queste librerie e so come funziona Java a livello di bytecode. Quello che voglio veramente sapere è quali tecniche fantastiche le persone hanno inventato per fare cose che non potresti fare diversamente, quindi ho in mente queste soluzioni ogni volta che inciampo su questi problemi. – ahe

4

Quindi, è possibile leggere bytecode per implementare un interprete/JVM. Si può scrivere/generare un bytecode quando si implementa un compilatore Java o un compilatore per un'altra lingua destinata alla JVM (ad esempio Scala e Jython). È possibile eseguire la manipolazione bytecode per ottimizzare il bytecode (se si desidera produrre e commercializzare un ottimizzatore bytecode o è necessario come strumento interno per dare un vantaggio alla propria azienda rispetto alla concorrenza). Analogamente, è possibile manipolare il bytecode per offuscarlo prima della distribuzione. È inoltre possibile eseguire la manipolazione bytecode per aspect-oriented programming; ad esempio, potresti voler inserire ganci (magari per scopi di temporizzazione o di registrazione o per altri motivi) e se fosse più semplice o meno costoso manipolare il bytecode piuttosto che modificare tutti i file di origine (come potrebbe essere il caso se il codice sorgente non è disponibile o da molte fonti diverse, che non tutte possono essere sotto il proprio controllo o per le quali potrebbe essere costoso e dispendioso in termini di tempo per convincere quelle squadre ad aggiungere tali hook), questo potrebbe essere il caso in cui renderebbe senso di inserire le modifiche all'output bytecode finale piuttosto che tentare di modificare il codice originale (che potrebbe richiedere l'upstreaming o il mantenimento di un fork separato o l'acquisto del codice sorgente da una terza parte che fornisce solo il bytecode).

È possibile manipolare il codice bytecode, anche se esistono numerose librerie e framework open source esistenti, inclusi BCEL e ASM per nominarne solo una coppia.

+0

"sarebbe meno costoso manipolare il bytecode piuttosto che modificare tutti i file sorgente" - In che modo? – kgdinesh

+1

@DineshBabu riformulato, fornito alcuni esempi per chiarire –

+0

Grazie, ma come si disattiva la manipolazione del codice byte come modello di progettazione? Se veniamo fuori dal regno di Java e parliamo nei linguaggi di programmazione in generale, non tutti hanno questa caratteristica. Come fanno a fare le cose? – kgdinesh

3

Ci sono documenti Patterns of Aspect-Oriented Design (PDF) e Aspect-Oriented Design Principles: Lessons from Object-Oriented Design (PDF) che descrivono alcuni modelli per la manipolazione AOP/bytecode.

Personalmente ho utilizzato la manipolazione del codice utente con ASM in one framework per generare un codice di codice per le classi che utilizzano tale framework. Il framework richiede i metodi custom equals() e hashCode() per il codice client, quindi I generate those agganciando un Java Agent che modifica il bytecode mentre ClassLoader carica le classi.Ho anche usato molte volte lo CGLIB per produrre proxy dinamici (se questo conta come AOP).

0

Alcuni framework come BEA KODO (implementazione della specifica Java Data Objects) utilizzano la manipolazione bytecode per "migliorare" Plain Old Java Objects e aggiungere la logica di persistenza, in base a una descrizione XML.

Quindi, le informazioni di mappatura del database vengono quindi generate automaticamente sul bytecode.

Problemi correlati