我正在寻找一个生成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,:-)
Sun提供了一个名为CodeModel的API,用于使用API生成Java源文件.获取信息并不是最容易的事情,但它确实存在并且效果非常好.
获取它的最简单方法是作为JAXB 2 RI的一部分 - XJC模式到java生成器使用CodeModel生成其java源,它是XJC jar的一部分.您只能将它用于CodeModel.
从http://codemodel.java.net/抓取它
使用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; } }
使用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(); } }
您可以使用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; } }
另一种选择是Eclipse JDT的AST,如果你需要重写任意Java源代码而不仅仅是生成源代码,这是很好的.(我相信它可以独立于eclipse使用).