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은 API를 사용하여 Java 소스 파일을 생성하기 위해 CodeModel이라는 API를 제공합니다. 정보를 얻는 것이 가장 쉬운 것은 아니지만 거기에 있으며 매우 잘 작동합니다.
그것을 잡는 가장 쉬운 방법은 JAXB 2 RI의 일부입니다. XJC schema-to-java 생성기는 CodeModel을 사용하여 Java 소스를 생성하며 XJC jar의 일부입니다. CodeModel에만 사용할 수 있습니다.
http://codemodel.java.net/ 에서 가져옵니다 .
답변
CodeModel
Thanks, 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
Thanks, 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<X> {
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 소스 코드를 다시 작성해야하는 경우에 좋습니다. (그리고 나는 일식과 독립적으로 사용할 수 있다고 생각합니다).