首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于生成Java源文件的Java API

用于生成Java源文件的Java API
EN

Stack Overflow用户
提问于 2008-09-23 14:26:27
回答 15查看 55.7K关注 0票数 130

我正在寻找一个框架来生成Java源文件。

类似于下面的API:

代码语言:javascript
复制
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. 我正在寻找一个高级抽象,而不是直接的字节码

还需要对象树中的“类结构”。

  1. 问题领域是通用的:生成大量非常不同的类,而不是“公共结构”。

<>G214>

解决方案

我已经根据你的答案发布了2个答案...with CodeModelwith Eclipse JDT

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

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2008-09-23 16:41:46

Sun提供了一个名为CodeModel的应用程序接口,用于使用应用程序接口生成Java源文件。这并不是获取信息最容易的事情,但它就在那里,而且工作得非常好。

获得它的最简单方法是将其作为JAXB2RI的一部分-- XJC schema- to -java生成器使用CodeModel生成其java源代码,并且它是XJC的一部分。您可以将其仅用于CodeModel。

http://codemodel.java.net/上获取它

票数 70
EN

Stack Overflow用户

发布于 2008-09-25 20:53:37

通过CodeModel找到解决方案

谢谢,skaffman

例如,使用以下代码:

代码语言:javascript
复制
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);

我可以得到以下输出:

代码语言:javascript
复制
package foo;
public class Bar {
    int foo() {
        return  5;
    }
}
票数 46
EN

Stack Overflow用户

发布于 2008-09-25 20:54:11

使用Eclipse JDT的AST找到解决方案

谢谢,Giles

例如,使用以下代码:

代码语言:javascript
复制
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);

我可以得到以下输出:

代码语言:javascript
复制
package foo;
import java.util.Set;
class Foo<X> {
  void MISSING(){
    x();
  }
}
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/121324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档