Question

Je suis un partisan de la 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 apprendre davantage?

Était-ce utile?

La solution

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.

Edit: C’est une vieille réponse; Depuis 2011, nous utilisons Java 7, avec des annotations pouvant être utilisées pour de telles supercheries .

Autres conseils

Consultez Clojure . C'est un LISP avec Macros (méta-programmation) qui fonctionne sur la JVM et qui est très interopérable avec Java.

Qu'entendez-vous exactement par " métaprogrammation statique " Oui, la métaprogrammation de modèles C ++ est impossible en Java, mais elle offre d’autres méthodes, beaucoup plus puissantes que celles de C ++:

  • réflexion
  • programmation orientée aspect (@AspectJ)
  • manipulation du bytecode (Javassist, ObjectWeb ASM, agents Java)
  • génération de code (outil de traitement d'annotation, moteurs de gabarit tels que Velocity)
  • Manipulations de l’arbre de syntaxe abstraite (API fournies par des IDE populaires)
  • possibilité d'exécuter le compilateur Java 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 souplesse de la machine virtuelle Java, toutes ces méthodes peuvent être utilisées à la fois lors de la compilation et de l'exécution.

Non. Encore plus, les types génériques sont effacés de leur limite supérieure par le compilateur, 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 le gommage de type et de rendre l'objet Class<T> de votre type T. Cela dit, il ne s'agit que d'un hack.

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

Si vous avez besoin d'une logique de compilation puissante pour Java, vous pouvez le faire en générant du code. Comme d’autres affiches l’ont souligné, le langage Java ne fournit aucune fonctionnalité adaptée à la logique de compilation, c’est peut-être votre meilleure option (si vous avez vraiment besoin de la logique de compilation). Une fois que vous avez épuisé les autres possibilités et que vous êtes sûr de générer du code, vous pourriez être intéressé par mon projet open source Rjava, disponible à l'adresse

.

http://www.github.com/blak3mill3r

Il s’agit d’une bibliothèque de génération de code Java écrite en Ruby, que j’ai écrite afin de générer automatiquement les interfaces Google Web Toolkit pour les applications Ruby on Rails. Cela s’est révélé très utile pour cela.

En guise d'avertissement, il peut être très difficile de déboguer le code Rjava. Rjava ne fait pas beaucoup de vérification, il suppose simplement que vous savez ce que vous faites. C'est à peu près l'état de la métaprogrammation statique de toute façon. Je dirais qu'il est beaucoup plus facile de déboguer que tout ce qui n'est pas trivial avec C ++ TMP, et qu'il est possible de l'utiliser pour le même genre de choses.

Quoi qu'il en soit, si vous envisagiez d'écrire un programme générant du code source Java, arrêtez-vous maintenant et jetez un œil à Rjava. Il ne fait peut-être pas encore ce que vous voulez, mais il est sous licence MIT, alors n'hésitez pas à l'améliorer, à le cuire à fond ou à le vendre à votre grand-mère. Je serais ravi que d'autres développeurs expérimentés en programmation générique puissent commenter le design.

Lombok offre une forme faible de métaprogrammation au moment de la compilation. Cependant, la technique utilisée est complètement générale .

Voir la transformation de code Java au moment de la compilation pour une discussion connexe

Je ne suis pas sûr de comprendre les avantages de la méta-programmation statique.

En Java, vous pouvez réfléchir pour trouver des informations sur vos classes et faire tout ce que la méta-programmation ferait, vous devez simplement les faire dans votre code sans ajouter de nouvelle syntaxe ni de modes de pensée différents. Les annotations peuvent également effectuer certaines tâches de méta-programmation de manière plus structurée.

Je peux me tromper à ce sujet. J'envisage sérieusement de poser une question à ce sujet, car je ne suis pas sûr de bien comprendre. Il semble que la méta-programmation statique soit un hack qui évite le fait que certains langages ne gardent pas beaucoup d’informations de compilation disponibles au moment de l’exécution (l’un des points forts de Java et des langages dynamiques). / p>

Si quelqu'un pouvait répondre avec un lien vers un exemple où la méta-programmation offre une solution plus compréhensible, lisible ou meilleure que la réflexion, j'apprécierais l'effort.

Le projet Manifold offre une métaprogrammation statique en mode sécurisé pour Java. Vous pouvez l'utiliser pour créer des types de manière dynamique au moment de la compilation, à mesure que Javac résout les noms de types. La la démonstration du schéma JSON illustre la métaprogrammation statique en termes de projection dynamique de type compilation (sans code). génération de génération).

De plus, vous pouvez utiliser Manifold pour ajouter de nouvelles fonctionnalités. Découvrez le typage structural , Extensions de méthode et Type réflexion sécurisée . .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top