Estou procurando uma estrutura para gerar arquivos de origem Java.
Algo como a seguinte API:
X clazz = Something.createClass("package name", "class name");
clazz.addSuperInterface("interface name");
clazz.addMethod("method name", returnType, argumentTypes, ...);
File targetDir = ...;
clazz.generate(targetDir);
Em seguida, um arquivo de origem java deve ser encontrado em um subdiretório do diretório de destino.
Alguém conhece essa estrutura?
EDIT :
- Eu realmente preciso dos arquivos de origem.
- Eu também gostaria de preencher o código dos métodos.
- Estou procurando uma abstração de alto nível, não manipulação / geração direta de bytecode.
- Eu também preciso da "estrutura da classe" em uma árvore de objetos.
- O domínio do problema é geral: gerar uma grande quantidade de classes muito diferentes, sem uma "estrutura comum".
SOLUÇÕES
Postei 2 respostas com base em suas respostas ... com o CodeModel e com o Eclipse JDT .
Eu usei o CodeModel na minha solução: :-)
java
eclipse
code-generation
Daniel Fanjul
fonte
fonte
Respostas:
A Sun fornece uma API chamada CodeModel para gerar arquivos de origem Java usando uma API. Não é a coisa mais fácil de obter informações, mas existe e funciona muito bem.
A maneira mais fácil de se apossar dele é como parte do JAXB 2 RI - o gerador de esquema para java XJC usa o CodeModel para gerar sua fonte java e faz parte dos jars XJC. Você pode usá-lo apenas para o CodeModel.
Pegue-o em http://codemodel.java.net/
fonte
Solução encontrada com o CodeModel
Obrigado, skaffman .
Por exemplo, com este código:
Eu posso obter esta saída:
fonte
cm._class(...)
como argumento de tipo de retorno paradc.method(...)
.Solução encontrada com o AST do Eclipse JDT
Obrigado, Giles .
Por exemplo, com este código:
Eu posso obter esta saída:
fonte
Você pode usar o Roaster ( https://github.com/forge/roaster ) para gerar o código.
Aqui está um exemplo:
exibirá a seguinte saída:
fonte
Outra alternativa é o AST do Eclipse JDT, que é bom se você precisar reescrever o código-fonte Java arbitrário em vez de apenas gerar o código-fonte. (e acredito que possa ser usado independentemente do eclipse).
fonte
O projeto Eclipse JET pode ser usado para gerar a fonte. Não acho que a API seja exatamente igual à que você descreveu, mas toda vez que ouvi falar de um projeto que gera geração de código-fonte Java, eles usaram o JET ou uma ferramenta caseira.
fonte
Não conhece uma biblioteca, mas um mecanismo de modelo genérico pode ser tudo o que você precisa. Existem vários deles , eu pessoalmente tive uma boa experiência com o FreeMarker
fonte
Eu criei algo que se parece muito com o seu DSL teórico, chamado "sourcegen", mas tecnicamente em vez de um projeto util para um ORM que escrevi. O DSL se parece com:
https://github.com/stephenh/joist/blob/master/util/src/test/java/joist/sourcegen/GClassTest.java
Ele também faz algumas coisas legais como "Organizar automaticamente importações" quaisquer FQCNs em parâmetros / tipos de retorno, removendo automaticamente todos os arquivos antigos que não foram tocados nessa execução de codegen, recuando corretamente as classes internas, etc.
A idéia é que o código gerado seja bonito de se ver, sem avisos (importações não usadas etc.), assim como o restante do código. Tanto código gerado é feio de ler ... é horrível.
De qualquer forma, não há muitos documentos, mas acho que a API é bem simples / intuitiva. O repo Maven está aqui se alguém estiver interessado.
fonte
Se você realmente precisa da fonte, não sei de nada que gere a fonte. No entanto, você pode usar o ASM ou o CGLIB para criar diretamente os arquivos .class.
Você pode gerar origem a partir deles, mas eu os usei apenas para gerar bytecode.
fonte
Eu mesmo estava fazendo isso por uma ferramenta de gerador simulado. É uma tarefa muito simples, mesmo se você precisar seguir as diretrizes de formatação da Sun. Aposto que você terminaria o código que faz isso mais rapidamente do que você encontrou algo que se encaixa no seu objetivo na Internet.
Você basicamente descreveu a API por conta própria. Basta preenchê-lo com o código real agora!
fonte
Há também StringTemplate . É do autor da ANTLR e é bastante poderoso.
fonte
Há um novo projeto write-it-once . Gerador de código baseado em modelo. Você escreve um modelo personalizado usando o Groovy e gera um arquivo dependendo das reflexões java. É a maneira mais simples de gerar qualquer arquivo. Você pode criar getters / settest / toString gerando arquivos AspectJ, SQL com base em anotações JPA, inserções / atualizações com base em enumerações e assim por diante.
Exemplo de modelo:
fonte
Realmente depende do que você está tentando fazer. A geração de código é um tópico em si. Sem um caso de uso específico, sugiro examinar a biblioteca de geração / modelo de código de velocidade. Além disso, se você estiver gerando código offline, sugiro usar algo como ArgoUML para passar do diagrama UML / modelo de objeto para o código Java.
fonte
Exemplo: 1 /
2 /
fonte
Aqui está um projeto JSON para POJO que parece interessante:
http://www.jsonschema2pojo.org/
fonte