39 votes

La métaprogrammation statique est-elle possible en Java?

Je suis un fan de métaprogrammation statique en C ++ . Je sais que Java a maintenant des génériques. Est-ce que cela signifie que la métaprogrammation statique (c'est-à-dire l'exécution du programme à la compilation) est possible en Java? Si tel est le cas, quelqu'un peut-il recommander de bonnes ressources pour en savoir plus?

24voto

Thomas Points 63635

Non, ce n'est pas possible. Les génériques ne sont pas aussi puissants que les modèles. Par exemple, un argument de modèle peut être un type défini par l'utilisateur, un type primitif ou une valeur; mais un argument de modèle générique ne peut être que Object ou un sous-type de celui-ci.

13voto

Lou Franco Points 48823

Jetez un coup d'oeil à Clojure . C'est un LISP avec Macros (méta-programmation) qui s'exécute sur la JVM et qui est très interopérable avec Java.

8voto

iirekm Points 2338

Que voulez-vous dire exactement par "statique métaprogrammation"? Oui, C++ modèle de la métaprogrammation est impossible en Java, mais il offre d'autres méthodes, beaucoup plus puissants que ceux de C++:

  • la réflexion
  • programmation orientée aspects (@AspectJ)
  • manipulation de bytecode (Javassist, ObjectWeb ASM, Java agents)
  • la génération de code (Annotation Processing Tool, moteurs de template comme la Vitesse)
  • Arbre de Syntaxe abstraite manipulations (Api fournies par populaire IDEs)
  • possibilité d'exécuter Java compiler et d'utiliser le code compilé, même au moment de l'exécution

Il n'y a pas de meilleure méthode: chacune de ces méthodes a ses forces et ses faiblesses. En raison de la flexibilité de la JVM, l'ensemble de ces méthodes en Java peut être utilisé à la fois au moment de la compilation et de l'exécution.

4voto

Torsten Marek Points 27554

Encore plus, les compilateurs effacent la limite supérieure des types génériques. Vous ne pouvez donc pas créer une nouvelle instance d'un type générique T au moment de l'exécution.

La meilleure façon de faire du métaprogamme en Java est de contourner l’effacement de type et de rendre l’objet Class<T> de votre type T. Néanmoins, il ne s’agit là que d’un hack.

1voto

larsivi Points 1298

Non, les génériques en Java ne sont qu'un moyen d'éviter le casting d'Object.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X