[java] Java 소스 파일을 생성하는 Java API

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 소스 파일을 찾아야합니다.

누구나 그런 프레임 워크를 알고 있습니까?


편집 :

  1. 정말 소스 파일이 필요합니다.
  2. 또한 메소드의 코드를 작성하고 싶습니다.
  3. 직접적인 바이트 코드 조작 / 생성이 아닌 높은 수준의 추상화를 찾고 있습니다.
  4. 또한 객체 트리에서 “클래스의 구조”가 필요합니다.
  5. 문제 영역은 일반적입니다. “공통 구조”없이 많은 다른 클래스를 생성하는 것입니다.

솔루션
나는 귀하의 답변을 기반으로 2 개의 답변을 게시했습니다 … CodeModelEclipse 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 소스 코드를 다시 작성해야하는 경우에 좋습니다. (그리고 나는 일식과 독립적으로 사용할 수 있다고 생각합니다).


답변

이클립스 제트 프로젝트는 소스 생성을 수행하는 데 사용할 수 있습니다. 나는 그것이 API라고 생각하는 것과 정확히 같지는 않지만 Java 소스 생성을 수행하는 프로젝트를 들었을 때마다 JET 또는 자체 개발 도구를 사용했습니다.


답변

라이브러리를 모르지만 일반 템플릿 엔진 만 있으면됩니다. 가 있습니다 그들의 무리는 , 나는 개인적으로 좋은 경험이 있었다 프리 마커를