Domanda

un collega mi ha segnalato l'altro giorno per BCEL che , come meglio posso dire, da la sua spiegazione e lettura veloce, un modo per modificare in fase di esecuzione il codice byte.Il mio primo pensiero è stato che sembrava pericoloso, e il mio secondo pensiero è stato che suonava bene.Poi ho dato un po di più il pensiero e mi ha ricordato l' codinghorror post su monkey patching e si rese conto che questo era in pratica la stessa cosa.Qualcuno ha mai usato BCEL per qualcosa di pratico?Io sto giusto che questo è fondamentalmente il tempo di esecuzione monkey patching, o mi manca qualcosa?

È stato utile?

Soluzione

È un po ' più basso livello di monkey patching, e da quello che ho letto, le classi già caricato nella VM non sono aggiornati.Supporta solo il salvataggio di file di classe, di nuovo, non modifica il tempo di esecuzione delle classi.

Altri suggerimenti

Da BCEL FAQ:

Q:È possibile creare o modificare le classi dinamicamente con BCEL?

A:BCEL contiene classi utili nel util pacchetto, cioè ClassLoader e JavaWrapper.Date un'occhiata al ProxyCreator esempio.

Ma monkeypatching è...uhm...controverso, e probabilmente non dovrebbe usare se la tua lingua non la supporta.

Se si dispone di un buon caso d'uso per si, mi permetto di suggerire embbededing Jython?

Si potrebbe guardare come monkey patching.Io preferisco non usarlo (forse non avevo mai affrontato un buon caso di utilizzo per questo?), ma avere familiarità con esso (per avere un'idea di come la Primavera e l'Hibenrate utilizzare e perché).

Vedere questo realworld esempio: Jawk - Compilatore Del Modulo.BCEL è utile per la "compilazione" ur di lingua su misura.

BCEL non supporta monkey patching, solo che manipola con bytecode e possibilmente carica in un custom classloader.Tuttavia si possibile implementare monkeypatching su JVM utilizzando la libreria come BCEL e Java agente.L'agente Java (caricato da -javaagent argomento) può accedere alla Strumentazione API e modificare le classi caricate.Non è difficile da implementare tramite alcuni ponti.

Ma ricordate:

  • Non so se dover usare-javaagent è qualcosa che si desidera.
  • In qualsiasi lingua, monkey patching può portare a mal comportamento prevedibile.
  • È possibile modificare un metodo.In teoria, si può anche aggiungere qualche metodo, ma è necessario compilare il progetto contro modificato (patchato) classi.Penso che questo potrebbe causare un sacco di dolore e non vale la pena di farlo.Ci sono altre lingue che lo supportano (ad es.Groovy) o suppport qualcosa di simile (ad es.le conversioni implicite in Scala).
  • È meglio progettare il vostro API di utilizzare il monkey patching.Può essere piuttosto utile per le librerie di terze parti.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top