当前位置:  开发笔记 > 编程语言 > 正文

用于生成Java源文件的Java API

如何解决《用于生成Java源文件的JavaAPI》经验,为你挑选了5个好方法。

我正在寻找一个生成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源文件.

有谁知道这样的框架?


编辑:

    我真的需要源文件.

    我也想填写方法的代码.

    我正在寻找高级抽象,而不是直接字节码操作/生成.

    我还需要一个对象树中的"类的结构".

    问题域是通用的:生成大量非常不同的类,没有"共同结构".


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

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



1> skaffman..:

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

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

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


这正是我需要的!简单而功能齐全.谢谢,谢谢!

2> Daniel Fanju..:

使用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;
    }
}



3> Daniel Fanju..:

使用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 {
  void MISSING(){
    x();
  }
}



4> gastaldi..:

您可以使用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);

将显示以下输出:

public class MyClass {
   private String testMethod() {
       return null;
   }
}



5> Squirrel..:

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

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有