Domanda

In Java, è possibile creare una definizione di classe al volo, mentre un'applicazione è in esecuzione, e quindi creare un oggetto di quella classe?

Ad esempio, un'applicazione in esecuzione leggerebbe in un file di testo che contiene un elenco dei membri della classe a includere nella nuova classe. L'applicazione dovrebbe quindi definire una definizione di classe in base alla lista dei membri, e quindi insantiate esso.

È stato utile?

Soluzione

Sì, è possibile farlo in teoria il file di classe è il codice di byte, che si trova alla fine di un array di byte! è quindi possibile utilizzare il metodo defineClass (String, byte [], int, int) per ottenere un'istanza di classe che può essere utilizzato per creare un'istanza di oggetti attraverso la riflessione.

In pratica si può usare qualcosa di simile a CGLIB o javaassist .

È inoltre possibile utilizzare il lungo cammino di generare il codice Java in un file, invocando il compilatore, poi il caricamento del file.

Altri suggerimenti

È possibile generare dinamicamente le classi utilizzando ASM

È possibile farlo scrivendo il codice per la nuova classe in un file, quindi invocare il compilatore Java su quel file e l'utilizzo di un programma di caricamento classe per caricare dinamicamente quella classe nella vostra applicazione in esecuzione. Apache Tomcat fa questo per le sue pagine JSP; ci vuole il codice, apporta alcune modifiche ad esso, avvolge in un blocco try / catch nel bel mezzo di una classe, che si scrive poi al file system, lo compila, e utilizza un programma di caricamento classe per ottenere e citare in giudizio per servire le richieste.

Certo che è possibile. Si veda ad esempio questo articolo .

Forse il semplice soluzione (in termini di non richiedere librerie extra) potrebbe essere quella di utilizzare il compilatore Java API che viene fornito con Java 6. basta solo essere in grado di generare il java, compilare e quindi eseguire un Class.forName () .

Forse un po 'eccessivo, il Apache BCEL (Byte Codice Engineering Library) può essere utilizzato per creare file class durante il runtime.

Anche se non ho provato io stesso, in teoria, si potrebbe quindi creare una classe, caricarlo, e un'istanza durante l'esecuzione.

Sì, è possibile.

È possibile creare classi con Javassist in fase di runtime che definisce il corpo della classe e rendere javassist compilare il nuova classe.

Javassist ha un compilatore personalizzato che crea bytecode basato sulla definizione della classe. Ha alcuni modi particolari per gestire le cose, ma è molto facile e intuitivo da usare questa libreria.

Javassist viene utilizzato su JBoss, e penso che sia un buon riferimento:)

Lo stesso può essere realizzato con BCEL , ma è molto più difficile (ma in questo modo si avere più controllo su ciò che viene generato).

Si potrebbe forse fare qualcosa di simile con JRuby, o JPython o Groovy se è necessario.

Se vi sentite particolarmente masochista si poteva guardare BCEL .

Se si desidera Java e metaprogrammazione, utilizzare Groovy .

ASM è il più basso livello di libreria di bytecode per Java, suppongo. Questo rende molto difficile, ma anche molto potente. Mi raccomando di leggere la documentazione di ASM ( PDF ) per capire veramente come generazione bytecode in Java funziona. Tale documentazione spiega anche come caricare il bytecode nel caricatore di classe (un altro argomento difficile da fare a destra).

Dopo di che è possibile utilizzare una delle biblioteche di livello superiore, se rende la vita più facile, e capire quello che fanno. Per molti casi, come proxy di generazione, il CGLIB è utile e semplice da usare. Per una maggiore potenza, molti hanno già detto Javassist (Mi rifugio' t usato -. CGLIB e ASM sono stati buoni per me)

C'è stato un recente domanda qui per quanto riguarda in memoria compilation che dovrebbe dare alcuni suggerimenti su cosa fare dopo che sei riuscito a generare il codice sorgente.

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