2008-12-04 10 views
6

J'ai une étape de post-compilation qui manipule le bytecode Java des classes générées. Je voudrais rendre la vie aussi facile que possible pour les consommateurs de bibliothèques, donc je cherche des façons de rendre ce processus automatique et (si possible) compilateur agnostique.Branchement aux compilateurs Java

Le Annotation Processing API fournit la plupart des fonctionnalités souhaitées (découverte automatique du service, prise en charge par Eclipse). Malheureusement, cette action vise à des générateurs de code et doesn't support manipulation of existing artefacts:

Les entrées initiales à l'outil sont considérés être créés par le zeroth tour; par conséquent, tenter de créer un fichier source ou classe correspondant à l'une de ces entrées entraînera une FilerException.

Le motif Décorateur recommandé par l'API n'est pas une option.

Je peux voir comment exécuter l'étape avec un agent/instrumentation d'exécution, mais c'est une option pire qu'une étape de construction manuelle car cela exigerait que toute personne, même touchée par l'API, configure ses JVM de manière non évidente. manière.

Existe-t-il un moyen de se connecter ou d'envelopper le compiler tool tel qu'appelé par javac? Est-ce que quelqu'un a subverti avec succès les processeurs d'annotation pour manipuler le bytecode, peu importe ce que dit le doc?

Répondre

4

Le compilateur Groovy est le seul compilateur bytecode qui permet de connecter le processus de compilation (exemple: Generate bytecode to support the Singleton pattern)

L'Annotation API de traitement ne vise pas à modifier le code. Comme vous l'avez déjà découvert, tout ce que vous pouvez faire est d'installer un classloader, d'examiner le bytecode à l'exécution et de le manipuler. C'est braindead mais ça marche. Cela suit le général "nous avons peur qu'un développeur puisse essayer quelque chose de stupide" thème que vous trouverez dans Java. Il n'y a aucun moyen d'étendre javac. Les classes pertinentes sont privées, finales ou vont changer avec la prochaine version de Java.

Une autre option est d'écrire Java annoté, par exemple vous écrivez une classe "ExampleTpl.java". Ensuite, vous utilisez un précompilateur qui développe les annotations dans ce fichier pour obtenir "Example.java". Dans le reste du code, vous utilisez Example et ignorez ExampleTpl. Pour Eclipse, il existe un bug report to automate this step. Je ne suis au courant d'aucun autre travail dans ce domaine.

3

Cela peut être fait.

Jetez un oeil à mon article de blog Roman Numerals, in our Java où un processeur d'annotation est utilisé pour réécrire le code. La limitation étant que cela fonctionne uniquement avec le javac de Sun.

+0

Votre lien est mort. –

Questions connexes