130

Java ソース ファイルを生成するためのフレームワークを探しています。

次の API のようなもの:

X clazz = Something.createClass("package name", "class name");
clazz.addSuperInterface("interface name");
clazz.addMethod("method name", returnType, argumentTypes, ...);

File targetDir = ...;
clazz.generate(targetDir);

次に、Java ソース ファイルがターゲット ディレクトリのサブディレクトリにあるはずです。

誰かそのようなフレームワークを知っていますか?


編集

  1. ソースファイルが本当に必要です。
  2. メソッドのコードも記入したいと思います。
  3. バイトコードの直接操作/生成ではなく、高レベルの抽象化を探しています。
  4. オブジェクトのツリーには「クラスの構造」も必要です。
  5. 問題のドメインは一般的です。「共通の構造」なしで、非常に異なるクラスを大量に生成することです。

解決
策 私はあなたの答えに基づいて2つの答えを投稿しました... with CodeModelEclipse JDT

私は自分のソリューションでCodeModelを使用しました:-)

4

15 に答える 15

70

Sun は、API を使用して Java ソース ファイルを生成するための CodeModel という API を提供しています。情報を入手するのは簡単なことではありませんが、そこにあり、非常にうまく機能します.

これを入手する最も簡単な方法は、JAXB 2 RI の一部として使用することです。XJC スキーマから Java へのジェネレーターは、CodeModel を使用してその Java ソースを生成します。これは、XJC jar の一部です。CodeModel だけに使用できます。

http://codemodel.java.net/から入手してください

于 2008-09-23T16:41:45.973 に答える
46

CodeModel で解決策が見つかりました skaffman さん
ありがとうございます。

たとえば、次のコードを使用します。

JCodeModel cm = new JCodeModel();
JDefinedClass dc = cm._class("foo.Bar");
JMethod m = dc.method(0, int.class, "foo");
m.body()._return(JExpr.lit(5));

File file = new File("./target/classes");
file.mkdirs();
cm.build(file);

私はこの出力を得ることができます:

package foo;
public class Bar {
    int foo() {
        return  5;
    }
}
于 2008-09-25T20:53:36.867 に答える
28

解決策は Eclipse JDT の AST で見つかりました。Giles
感謝します。

たとえば、次のコードを使用します。

AST ast = AST.newAST(AST.JLS3);
CompilationUnit cu = ast.newCompilationUnit();

PackageDeclaration p1 = ast.newPackageDeclaration();
p1.setName(ast.newSimpleName("foo"));
cu.setPackage(p1);

ImportDeclaration id = ast.newImportDeclaration();
id.setName(ast.newName(new String[] { "java", "util", "Set" }));
cu.imports().add(id);

TypeDeclaration td = ast.newTypeDeclaration();
td.setName(ast.newSimpleName("Foo"));
TypeParameter tp = ast.newTypeParameter();
tp.setName(ast.newSimpleName("X"));
td.typeParameters().add(tp);
cu.types().add(td);

MethodDeclaration md = ast.newMethodDeclaration();
td.bodyDeclarations().add(md);

Block block = ast.newBlock();
md.setBody(block);

MethodInvocation mi = ast.newMethodInvocation();
mi.setName(ast.newSimpleName("x"));

ExpressionStatement e = ast.newExpressionStatement(mi);
block.statements().add(e);

System.out.println(cu);

私はこの出力を得ることができます:

package foo;
import java.util.Set;
class Foo<X> {
  void MISSING(){
    x();
  }
}
于 2008-09-25T20:54:11.170 に答える
9

もう 1 つの代替手段は、Eclipse JDT の AST です。これは、ソース コードを生成するだけでなく、任意の Java ソース コードを書き直す必要がある場合に適しています。(そして、Eclipseとは独立して使用できると思います)。

于 2008-09-23T15:19:38.120 に答える
4

Eclipse JETプロジェクトを使用してソースを生成できます。APIがあなたが説明したものとまったく同じではないと思いますが、Javaソース生成を行うプロジェクトについて聞くたびに、彼らはJETまたは自家製のツールを使用しました.

于 2008-09-23T14:37:04.040 に答える
3

ライブラリについては知りませんが、必要なのは汎用テンプレート エンジンだけかもしれません。それらの束があり、私は個人的にFreeMarkerで良い経験をしました

于 2008-09-23T15:25:08.967 に答える
1

私はモックジェネレーターツールのために自分でやっていました。Sun の書式設定ガイドラインに従う必要がある場合でも、これは非常に簡単な作業です。インターネット上で自分の目的に合ったものを見つけるよりも早くコードを完成させるに違いありません。

基本的に、API の概要を自分で説明しました。今すぐ実際のコードを入力してください。

于 2008-09-23T15:00:52.813 に答える
1

新しいプロジェクトwrite-it-once があります。テンプレート ベースのコード ジェネレーター。Groovyを使用してカスタム テンプレートを記述し、Java リフレクションに応じてファイルを生成します。これは、任意のファイルを生成する最も簡単な方法です。AspectJ ファイル、JPA アノテーションに基づく SQL、enum に基づく挿入/更新などを生成することで、getters/settest/toString を作成できます。

テンプレートの例:

package ${cls.package.name};

public class ${cls.shortName}Builder {

    public static ${cls.name}Builder builder() {
        return new ${cls.name}Builder();
    }
<% for(field in cls.fields) {%>
    private ${field.type.name} ${field.name};
<% } %>
<% for(field in cls.fields) {%>
    public ${cls.name}Builder ${field.name}(${field.type.name} ${field.name}) {
        this.${field.name} = ${field.name};
        return this;
    }
<% } %>
    public ${cls.name} build() {
        final ${cls.name} data = new ${cls.name}();
<% for(field in cls.fields) {%>
        data.${field.setter.name}(this.${field.name});
<% } %>
        return data;
    }
}
于 2014-05-18T12:15:18.693 に答える
1

ソースが本当に必要な場合は、ソースを生成するものを知りません。ただし、ASMまたはCGLIBを使用して、.class ファイルを直接作成できます。

これらからソースを生成できるかもしれませんが、私はそれらをバイトコードの生成にしか使用していません。

于 2008-09-23T14:32:21.727 に答える
1

StringTemplateもあります。これは ANTLR の作成者によるもので、非常に強力です。

于 2009-09-22T22:38:12.960 に答える
0

それは本当にあなたがやろうとしていることに依存します。コード生成は、それ自体のトピックです。特定のユースケースがなければ、速度コード生成/テンプレート ライブラリを検討することをお勧めします。また、コード生成をオフラインで行う場合は、ArgoUML などを使用して UML ダイアグラム/オブジェクト モデルから Java コードに移行することをお勧めします。

于 2011-03-13T05:46:38.107 に答える