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源文件.
有谁知道这样的框架?
编辑:
解决方案
我根据您的答案发布了2个答案... 使用CodeModel和Eclipse JDT.
我在我的解决方案中使用了CodeModel,:-)
ska*_*man 69
Sun提供了一个名为CodeModel的API,用于使用API生成Java源文件.获取信息并不是最容易的事情,但它确实存在并且效果非常好.
获取它的最简单方法是作为JAXB 2 RI的一部分 - XJC模式到java生成器使用CodeModel生成其java源,它是XJC jar的一部分.您只能将它用于CodeModel.
从http://codemodel.java.net/抓取它
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)