Je recherche un framework pour générer des fichiers source Java.
Quelque chose comme l'API suivante:
X clazz = Something.createClass("package name", "class name");
clazz.addSuperInterface("interface name");
clazz.addMethod("method name", returnType, argumentTypes, ...);
File targetDir = ...;
clazz.generate(targetDir);
Ensuite, un fichier source java doit être trouvé dans un sous-répertoire du répertoire cible.
Quelqu'un connaît-il un tel cadre?
MODIFIER :
- J'ai vraiment besoin des fichiers source.
- Je voudrais également remplir le code des méthodes.
- Je recherche une abstraction de haut niveau, pas une manipulation / génération directe de bytecode.
- J'ai également besoin de la "structure de la classe" dans un arbre d'objets.
- Le domaine du problème est général: générer un grand nombre de classes très différentes, sans "structure commune".
SOLUTIONS
J'ai publié 2 réponses basées sur vos réponses ... avec CodeModel et avec Eclipse JDT .
J'ai utilisé CodeModel dans ma solution, :-)
java
eclipse
code-generation
Daniel Fanjul
la source
la source
Réponses:
Sun fournit une API appelée CodeModel pour générer des fichiers source Java à l'aide d'une API. Ce n'est pas la chose la plus facile pour obtenir des informations, mais c'est là et cela fonctionne extrêmement bien.
Le moyen le plus simple de s'en procurer est dans le cadre du JAXB 2 RI - le générateur XJC schema-to-java utilise CodeModel pour générer sa source java, et il fait partie des jars XJC. Vous pouvez l'utiliser uniquement pour le CodeModel.
Récupérez-le sur http://codemodel.java.net/
la source
Solution trouvée avec CodeModel
Merci, skaffman .
Par exemple, avec ce code:
Je peux obtenir cette sortie:
la source
cm._class(...)
comme argument de type de retour pourdc.method(...)
.Solution trouvée avec AST Eclipse JDT
Merci, Giles .
Par exemple, avec ce code:
Je peux obtenir cette sortie:
la source
Vous pouvez utiliser Roaster ( https://github.com/forge/roaster ) pour générer du code.
Voici un exemple:
affichera la sortie suivante:
la source
Une autre alternative est l'AST d'Eclipse JDT, qui convient si vous avez besoin de réécrire du code source Java arbitraire plutôt que de simplement générer du code source. (et je crois qu'il peut être utilisé indépendamment de l'éclipse).
la source
Le projet Eclipse JET peut être utilisé pour générer des sources. Je ne pense pas que son API soit exactement comme celle que vous avez décrite, mais chaque fois que j'ai entendu parler d'un projet faisant de la génération de sources Java, ils ont utilisé JET ou un outil local.
la source
Je ne connais pas de bibliothèque, mais un moteur de modèle générique pourrait suffire. Il y en a beaucoup , j'ai personnellement eu une bonne expérience avec FreeMarker
la source
J'ai construit quelque chose qui ressemble beaucoup à votre DSL théorique, appelé "sourcegen", mais techniquement au lieu d'un projet util pour un ORM que j'ai écrit. Le DSL ressemble à:
https://github.com/stephenh/joist/blob/master/util/src/test/java/joist/sourcegen/GClassTest.java
Il fait également des choses intéressantes comme «organiser automatiquement les importations» de tous les FQCN dans les paramètres / types de retour, élaguer automatiquement tous les anciens fichiers qui n'ont pas été touchés dans cette exécution de codegen, indenter correctement les classes internes, etc.
L'idée est que le code généré doit être joli à regarder, sans avertissement (importations inutilisées, etc.), tout comme le reste de votre code. Tant de code généré est moche à lire ... c'est horrible.
Quoi qu'il en soit, il n'y a pas beaucoup de documents, mais je pense que l'API est assez simple / intuitive. Le repo Maven est là si quelqu'un est intéressé.
la source
Si vous avez VRAIMENT besoin de la source, je ne connais rien qui génère la source. Vous pouvez cependant utiliser ASM ou CGLIB pour créer directement les fichiers .class.
Vous pourrez peut-être générer la source à partir de ceux-ci, mais je ne les ai utilisés que pour générer du bytecode.
la source
Je le faisais moi-même pour un outil générateur simulé. C'est une tâche très simple, même si vous devez suivre les directives de formatage de Sun. Je parie que vous finirez le code qui le fait plus rapidement que vous avez trouvé quelque chose qui correspond à votre objectif sur Internet.
Vous avez essentiellement décrit l'API vous-même. Remplissez-le simplement avec le code réel maintenant!
la source
Il existe également StringTemplate . Il est de l'auteur d'ANTLR et est assez puissant.
la source
Il y a un nouveau projet en écriture unique . Générateur de code basé sur un modèle. Vous écrivez un modèle personnalisé à l'aide de Groovy et générez un fichier en fonction des réflexions Java. C'est le moyen le plus simple de générer n'importe quel fichier. Vous pouvez créer des getters / settest / toString en générant des fichiers AspectJ, SQL basé sur des annotations JPA, des insertions / mises à jour basées sur des énumérations, etc.
Exemple de modèle:
la source
Cela dépend vraiment de ce que vous essayez de faire. La génération de code est un sujet en soi. Sans cas d'utilisation spécifique, je suggère de regarder la génération de code de vitesse / bibliothèque de modèles. De plus, si vous effectuez la génération de code hors ligne, je suggérerais d'utiliser quelque chose comme ArgoUML pour passer du diagramme UML / modèle objet au code Java.
la source
Exemple: 1 /
2 /
la source
Voici un projet JSON-to-POJO qui semble intéressant:
http://www.jsonschema2pojo.org/
la source