Domanda

Sono un fan di metaprogrammazione statica in C ++ . So che Java ora ha generici. Ciò significa che in Java è possibile la metaprogrammazione statica (ovvero l'esecuzione di programmi in fase di compilazione)? In tal caso, qualcuno può consigliare qualche buona risorsa in cui si può saperne di più?

È stato utile?

Soluzione

No, questo non è possibile. I generici non sono potenti come i modelli. Ad esempio, un argomento template può essere un tipo definito dall'utente, un tipo primitivo o un valore; ma un argomento modello generico può essere solo Object o un suo sottotipo.

Modifica: questa è una vecchia risposta; dal 2011 abbiamo Java 7, che ha Annotazioni che possono essere utilizzate per tale inganno .

Altri suggerimenti

Dai un'occhiata a Clojure . È un LISP con macro (meta-programmazione) che gira su JVM ed è molto interoperabile con Java.

Cosa intendi esattamente con " metaprogrammi statici " ;? Sì, la metaprogrammazione del modello C ++ è impossibile in Java, ma offre altri metodi, molto più potenti di quelli del C ++:

  • riflessione
  • programmazione orientata all'aspetto (@AspectJ)
  • manipolazione bytecode (Javassist, ObjectWeb ASM, agenti Java)
  • generazione di codice (strumento di elaborazione delle annotazioni, motori di template come Velocity)
  • Manipolazioni astratte dell'albero di sintassi (API fornite dai più comuni IDE)
  • possibilità di eseguire il compilatore Java e utilizzare il codice compilato anche in fase di esecuzione

Non esiste un metodo migliore: ognuno di questi metodi ha i suoi punti di forza e di debolezza. A causa della flessibilità di JVM, tutti questi metodi in Java possono essere utilizzati sia in fase di compilazione che in fase di esecuzione.

No. Ancora di più, i tipi generici vengono cancellati dal limite superiore dal compilatore, quindi non è possibile creare una nuova istanza di un tipo T generico in fase di esecuzione.

Il modo migliore per eseguire la metaprogamming in Java è aggirare la cancellazione del tipo e consegnare l'oggetto Class<T> del tuo tipo T. Tuttavia, questo è solo un trucco.

No, i generici in Java sono puramente un modo per evitare il casting di Object.

Se hai bisogno di una potente logica di compilazione per Java, un modo per farlo è con un qualche tipo di generazione del codice. Poiché, come hanno sottolineato altri poster, il linguaggio Java non fornisce alcuna funzionalità adatta per eseguire la logica di compilazione, questa potrebbe essere la migliore opzione (se hai davvero bisogno di una logica di compilazione). Una volta esaurite le altre possibilità e sei sicuro che vuoi fare la generazione di codice, potresti essere interessato al mio progetto open source Rjava, disponibile su:

http://www.github.com/blak3mill3r

È una libreria di generazione di codice Java scritta in Ruby, che ho scritto per generare automaticamente le interfacce di Google Web Toolkit per le applicazioni di Ruby on Rails. Si è rivelato abbastanza utile per questo.

Come avvertimento, può essere molto difficile eseguire il debug del codice Rjava, Rjava non fa molto controllo, presuppone solo che tu sappia cosa stai facendo. Questo è praticamente lo stato della metaprogrammazione statica comunque. Direi che è molto più facile eseguire il debug di qualsiasi cosa non banale fatta con C ++ TMP, ed è possibile usarlo per gli stessi tipi di cose.

Comunque, se stavi considerando di scrivere un programma che emette codice sorgente Java, fermati subito e controlla Rjava. Potrebbe non fare ancora quello che vuoi, ma ha la licenza MIT, quindi sentiti libero di migliorarlo, friggerlo o venderlo a tua nonna. Sarei felice di avere altri sviluppatori esperti nella programmazione generica per commentare il design.

Lombok offre una forma debole di metaprogrammazione del tempo di compilazione. Tuttavia, la tecnica che usano è completamente generale .

Vedi Trasformazione del codice Java al momento della compilazione per una discussione correlata

Non sono sicuro di comprendere il vantaggio della meta-programmazione statica.

In Java, puoi riflettere per trovare informazioni sulle tue classi e fare tutto ciò che farebbe la meta-programmazione, devi solo farle all'interno del tuo codice senza aggiungere nuova sintassi e diversi modi di pensare. Le annotazioni sono anche in grado di svolgere determinati compiti di meta-programmazione in un modo più strutturato.

Potrei sbagliarmi, sto seriamente pensando di aprire una domanda perché non sono sicuro di averlo. Sembra che la meta-programmazione statica sia un trucco accurato che aggira il fatto che alcuni linguaggi non mantengono molte informazioni in fase di compilazione disponibili in fase di esecuzione (uno dei punti di forza di Java e dei linguaggi dinamici).

Se qualcuno potesse rispondere con un link a un esempio in cui la meta-programmazione offre una soluzione più comprensibile, leggibile o comunque migliore della riflessione, apprezzerei lo sforzo.

Il Progetto collettore offre metaprogrammi statici sicuri per i tipi di Giava. Puoi usarlo per creare tipi dinamicamente in fase di compilazione mentre Javac risolve i nomi dei tipi. La Demo dello schema JSON mostra metaprogrammazione statica in termini di proiezione dinamica del tipo di compilazione in tempo (nessun codice passaggi di generazione della generazione).

Inoltre puoi usare Manifold per aggiungere nuove funzionalità. Consulta Digitazione strutturale , Estensioni di metodo e Tipo -safe Reflection . .

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