用于生成Java源文件的Java API

Dan*_*jul 124 java eclipse code-generation

我正在寻找一个生成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);
Run Code Online (Sandbox Code Playgroud)

然后,应在目标目录的子目录中找到java源文件.

有谁知道这样的框架?


编辑:

  1. 我真的需要源文件.
  2. 我也想填写方法的代码.
  3. 我正在寻找高级抽象,而不是直接字节码操作/生成.
  4. 我还需要一个对象树中的"类的结构".
  5. 问题域是通用的:生成大量非常不同的类,没有"共同结构".

解决方案
我根据您的答案发布了2个答案... 使用CodeModelEclipse JDT.

我在我的解决方案中使用了CodeModel,:-)

ska*_*man 69

Sun提供了一个名为CodeModel的API,用于使用API​​生成Java源文件.获取信息并不是最容易的事情,但它确实存在并且效果非常好.

获取它的最简单方法是作为JAXB 2 RI的一部分 - XJC模式到java生成器使用CodeModel生成其java源,它是XJC jar的一部分.您只能将它用于CodeModel.

http://codemodel.java.net/抓取它

  • 这正是我需要的!简单而功能齐全.谢谢,谢谢! (2认同)

Dan*_*jul 45

使用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);
Run Code Online (Sandbox Code Playgroud)

我可以得到这个输出:

package foo;
public class Bar {
    int foo() {
        return  5;
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*jul 27

使用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);
Run Code Online (Sandbox Code Playgroud)

我可以得到这个输出:

package foo;
import java.util.Set;
class Foo<X> {
  void MISSING(){
    x();
  }
}
Run Code Online (Sandbox Code Playgroud)


gas*_*ldi 17

您可以使用Roaster(https://github.com/forge/roaster)进行代码生成.

这是一个例子:

JavaClassSource source = Roaster.create(JavaClassSource.class);
source.setName("MyClass").setPublic();
source.addMethod().setName("testMethod").setPrivate().setBody("return null;")
           .setReturnType(String.class).addAnnotation(MyAnnotation.class);
System.out.println(source);
Run Code Online (Sandbox Code Playgroud)

将显示以下输出:

public class MyClass {
   private String testMethod() {
       return null;
   }
}
Run Code Online (Sandbox Code Playgroud)


Squ*_*rel 9

另一种选择是Eclipse JDT的AST,如果你需要重写任意Java源代码而不仅仅是生成源代码,这是很好的.(我相信它可以独立于eclipse使用).