La génération automatique de code source Java
Je suis à la recherche d'un moyen de générer automatiquement le code source de nouvelles méthodes à l'intérieur d'un code source Java fichier, basé sur les champs définis dans la classe.
En essence, je suis à la recherche d'exécuter les étapes suivantes:
- Les lire et les analyser
SomeClass.java
- Itérer sur tous les champs définis dans le code source
- Ajouter le code source de la méthode
someMethod()
- Enregistrer
SomeClass.java
(Idéalement, en préservant la mise en forme du code existant)
Quels sont les outils et les techniques les mieux adaptées à l'accomplir?
MODIFIER
Je ne veux pas générer de code lors de l'exécution; je veux augmenter les Java code source
Alternativement, vous pouvez écrire une meilleure interface. La génération de Code est très rarement nécessaire, car la plupart du temps, il peut être remplacé par une meilleure interface. Par exemple, vous pouvez avoir
SomeClass.java
mettre en œuvre une interface qui fournit someMethod()
ou vous pourriez avoir d'étendre une classe abstraite qui vous donne la someMethod()
de mise en œuvre dont vous avez besoin. Si someMethod()
est partout le même, vous pouvez également ajouter une autre interface et de mise en œuvre pour permettre son utilisation n'importe où vous voulez être en mesure de l'utiliser.OriginalL'auteur Tony the Pony | 2011-04-21
Vous devez vous connecter pour publier un commentaire.
Modifient le même fichier source de java avec l'auto-génération de code est entretien cauchemar. Pensez à générer une nouvelle classe qui étend la classe actuelle classe et ajoute la méthode souhaitée. Utiliser la réflexion pour lire de classe définie par l'utilisateur et de créer de la vitesse de modèles pour l'auto-générer les classes. Ensuite, pour chaque classe définie par l'utilisateur de la génération de l'extension de la classe. Intégrer la génération de code phase de votre cycle de vie.
Ou vous pouvez utiliser '"bytecode" valorisation " des techniques pour améliorer les classes sans avoir à modifier le code source.
Mises à jour:
J'ai posé une nouvelle question: stackoverflow.com/questions/5746099/...
OriginalL'auteur kunal
Ce que vous voulez, c'est un Programme De Transformation système.
Bon ceux qui ont des analyseurs pour la langue que vous souhaitez, construire ASTs représentant le programme pour l'analyse de code, de vous fournir l'accès à l'AST pour analaysis et de modification, et peut se régénérer à la source du texte à partir de l'AST. Votre remarque sur "la numérisation des champs" est juste une sorte de parcours de l'AST représentant du programme. Pour chaque analyse intéressante résultat que vous produisez, vous souhaitez apporter une modification à l'AST, peut-être quelque part d'autre, mais néanmoins dans l'AST.
Et après tous les chagnes sont faites, vous voulez régénérer texte avec des commentaires (comme initialement saisi, ou que vous avez construit dans votre nouveau code).
Il existe plusieurs outils qui le font spécifiquement pour Java.
Jackpot fournit un analyseur, construit ASTs, et vous permet de code Java des procédures pour faire ce que vous voulez avec les arbres. Avantage: facile sur le plan conceptuel. Inconvénient: vous écrivez beaucoup plus de code Java à monter autour de hack sur des arbres que vous attendez. Jackpot ne fonctionne qu'avec Java.
Stratego et TXL analyser votre code, construire ASTs, et vous permettent d'écrire des "surce-à-source" transformations (à l'aide de la syntaxe de la langue cible, par exemple, Java dans ce cas) pour exprimer les modèles et les correctifs. Plus de bonnes nouvelles: vous pouvez définir n'importe quel langage de programmation que vous aimez, comme la langue cible à traiter, et les deux ont une Java définitions.
Mais ils sont faibles sur l'analyse: souvent, vous avez besoin de tables de symboles, et de l'analyse des flux de données, pour vraiment faire des analyses et des changements dont vous avez besoin. Et ils insistent sur le fait que tout est une règle de réécriture, si qui vous aide à vous ou pas, c'est un peu comme en insistant vous avez seulement besoin d'un marteau dans la boîte à outils; après tout, tout peut être traité comme un clou, droit?
Notre Logiciel DMS de Réingénierie, Trousse à outils permet la définition d'un abitrary langue cible (et a de nombreux prédéfinis langues, y compris Java), comprend la totalité de la source-à-source de la transformation des capacités de Stratego, TXL, la procédure capacité de Jackpot,
et, de plus, fournit des tables de symboles, de contrôle et d'analyse de flux de données d'informations. Le compilateur gars nous a enseigné ces choses ont été nécessaire pour construire de solides compilateurs (= "analyse + optimisations + de raffinement") et il est vrai de la génération de code de systèmes de trop, pour exactement les mêmes raisons. En utilisant cette approche, vous pouvez générer du code et de l'optimiser dans la mesure où vous avez les connaissances nécessaires pour le faire. Un exemple, à l'instar de votre sérialisation des idées, est de générer rapidement XML des lecteurs et des auteurs pour XML Dtd; nous l'avons fait avec DMS pour Java et COBOL.
DMS a été utilisé pour lire/modifier/écrire de nombreux types de fichiers source. Un bel exemple, qui va rendre les idées claires peuvent être trouvés dans ce document technique, qui montre comment modifier le code pour insérer instrumentation sondes: Direction Générale De La Couverture Facile.
Une méthode plus simple, mais plus complète de l'exemple de la définition d'un arbitraire lanauges et les transformations à appliquer à il peut être trouvé à Comment transformer l'Algèbre en utilisant les mêmes idées.
OriginalL'auteur Ira Baxter
Ont un coup d'oeil à Java Émetteur Modèles. Ils vous permettent de créer des fichiers source java à l'aide d'un langage de marquage. Il est similaire à la façon dont vous pouvez utiliser un langage de script pour cracher HTML à l'exception de vous cracher le code source compilable. La syntaxe pour JET est très similaire à la JSP et n'est donc pas trop difficile à ramasser. Cependant c'est peut-être trop pour ce que vous essayez d'accomplir. Voici quelques ressources si vous décidez d'aller dans cette voie:
http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html
http://www.ibm.com/developerworks/library/os-ecemf2
http://www.vogella.de/articles/EclipseJET/article.html
OriginalL'auteur SamG
Vous pouvez utiliser cglib pour générer du code à l'exécution.
Merci, mais à la recherche d' code source génération
OriginalL'auteur u449355
Une itération à travers les champs et la définition de someMethod est une jolie vague énoncé du problème, il est donc difficile de vous donner un réponse utile, mais l'Éclipse de la prise en charge du refactoring contient d'excellents outils. Il va vous donner les constructeurs qui s'initialiser un ensemble sélectionné de la les membres définis, et il va également définir une méthode toString pour vous.
Je ne sais pas ce que les autres someMethod()'s que vous voulez examiner, mais il y a un début pour vous.
OriginalL'auteur CPerkins
Je serais très méfiant de l'injection de code généré dans les fichiers contenant du code. Écrite à la main le code doit être vérifiée dans le contrôle de révision, mais le code généré ne doit pas être; la génération de code doit faire partie du processus de construction. Vous devez structurer votre processus de construction de sorte que, pour chaque fichier, vous faire une copie temporaire, injecter le code source généré, et de compiler le résultat, sans toucher au fichier source d'origine que les développeurs travaillent sur.
partial
classes en Java)serait-il judicieux de le faire à l'aide de la réflexion, éventuellement guidée par des annotations sur le modèle de la classe, plutôt que de la modification de chaque classe qui a besoin d'être persisté?
Oui, c'est une approche valable aussi, mais je suis à la recherche pour une de plus) de rendement et b) de plus le code de la clarté (de Ma pensée est qu'il est plus facile de dire ce qui se passe en lisant le code généré que d'essayer de travailler sur les différentes conventions/annotations)
OriginalL'auteur Wyzard
Antlr est vraiment un excellent outil qui peut être utilisé très facilement pour la transformation de code source Java pour Java code source.
OriginalL'auteur Mike B