Estoy buscando un marco para generar archivos fuente Java.
Algo así como la siguiente API:
X clazz = Something.createClass("package name", "class name");
clazz.addSuperInterface("interface name");
clazz.addMethod("method name", returnType, argumentTypes, ...);
File targetDir = ...;
clazz.generate(targetDir);
Luego, se debe encontrar un archivo fuente de Java en un subdirectorio del directorio de destino.
¿Alguien sabe tal marco?
EDITAR :
- Realmente necesito los archivos fuente.
- También me gustaría completar el código de los métodos.
- Estoy buscando una abstracción de alto nivel, no manipulación / generación directa de bytecode.
- También necesito la "estructura de la clase" en un árbol de objetos.
- El dominio del problema es general: generar una gran cantidad de clases muy diferentes, sin una "estructura común".
SOLUCIONES
He publicado 2 respuestas basadas en sus respuestas ... con CodeModel y con Eclipse JDT .
He usado CodeModel en mi solución :-)
java
eclipse
code-generation
Daniel Fanjul
fuente
fuente
Respuestas:
Sun proporciona una API llamada CodeModel para generar archivos fuente Java utilizando una API. No es lo más fácil obtener información, pero está ahí y funciona extremadamente bien.
La forma más fácil de obtenerlo es como parte de JAXB 2 RI: el generador de esquema XJC a Java usa CodeModel para generar su fuente Java, y es parte de los frascos XJC. Puede usarlo solo para CodeModel.
Agarrarlo desde http://codemodel.java.net/
fuente
Solución encontrada con CodeModel
Gracias, skaffman .
Por ejemplo, con este código:
Puedo obtener esta salida:
fuente
cm._class(...)
como argumento de tipo de retorno paradc.method(...)
.Solución encontrada con AST de Eclipse JDT
Gracias, Giles .
Por ejemplo, con este código:
Puedo obtener esta salida:
fuente
Puede usar Roaster ( https://github.com/forge/roaster ) para generar código.
Aquí hay un ejemplo:
mostrará la siguiente salida:
fuente
Otra alternativa es el AST de Eclipse JDT, que es bueno si necesita reescribir código fuente arbitrario de Java en lugar de simplemente generar código fuente. (y creo que se puede usar independientemente del eclipse).
fuente
El proyecto Eclipse JET se puede utilizar para generar fuentes. No creo que su API sea exactamente como la que usted describió, pero cada vez que escuché de un proyecto que generaba fuentes de Java, utilizaron JET o una herramienta local.
fuente
No conozco una biblioteca, pero un motor de plantillas genérico podría ser todo lo que necesita. Hay un montón de ellos , personalmente he tenido una buena experiencia con FreeMarker
fuente
Construí algo que se parece mucho a su DSL teórico, llamado "sourcegen", pero técnicamente en lugar de un proyecto de utilidad para un ORM que escribí. El DSL se ve así:
https://github.com/stephenh/joist/blob/master/util/src/test/java/joist/sourcegen/GClassTest.java
También hace algunas cosas interesantes como "Organizar automáticamente las importaciones" de cualquier FQCN en parámetros / tipos de retorno, podar automáticamente los archivos antiguos que no se tocaron en esta ejecución de codegen, sangrar correctamente las clases internas, etc.
La idea es que el código generado debería ser bonito para mirarlo, sin advertencias (importaciones no utilizadas, etc.), al igual que el resto de su código. Tanto código generado es feo de leer ... es horrible.
De todos modos, no hay muchos documentos, pero creo que la API es bastante simple / intuitiva. El repositorio de Maven está aquí si alguien está interesado.
fuente
Si REALMENTE necesita la fuente, no sé de nada que genere la fuente. Sin embargo, puede usar ASM o CGLIB para crear directamente los archivos .class.
Es posible que pueda generar una fuente a partir de estos, pero solo los he usado para generar bytecode.
fuente
Lo estaba haciendo yo mismo para una herramienta de generador simulada. Es una tarea muy simple, incluso si necesita seguir las pautas de formato de Sun. Apuesto a que terminaría el código que lo hace más rápido que cuando encontró algo que se ajusta a su objetivo en Internet.
Básicamente, usted describió la API usted mismo. ¡Solo complételo con el código real ahora!
fuente
También hay StringTemplate . Es por el autor de ANTLR y es bastante poderoso.
fuente
Hay un nuevo proyecto para escribirlo una vez . Generador de código basado en plantillas. Usted escribe una plantilla personalizada usando Groovy y genera un archivo en función de los reflejos de Java. Es la forma más sencilla de generar cualquier archivo. Puede hacer getters / settest / toString generando archivos AspectJ, SQL basado en anotaciones JPA, inserciones / actualizaciones basadas en enumeraciones, etc.
Ejemplo de plantilla:
fuente
Realmente depende de lo que intentes hacer. La generación de código es un tema en sí mismo. Sin un caso de uso específico, sugiero buscar en la biblioteca de generación / plantilla de código de velocidad. Además, si está haciendo la generación de código fuera de línea, sugeriría usar algo como ArgoUML para pasar del diagrama UML / modelo de objetos al código Java.
fuente
Ejemplo: 1 /
2 /
fuente
Aquí hay un proyecto de JSON a POJO que parece interesante:
http://www.jsonschema2pojo.org/
fuente