根据现有代码生成代码

时间:2013-05-13 13:44:30

标签: java abstract-syntax-tree

我想生成基于现有Java代码的Java代码。

这是一个例子:

@A
class A {
  @A
  a;

  @A
  b;

  c;
}

@A
class B {
  a;

  @A
  b;

  c;
}

A.java,B.java - (代码转换器) - > A.java,B.java

转换后的代码应如下所示:

class A {
  a;

  b;
}

class B {
  b;
}

如您所见,使用自定义注释注释的所有内容(类,字段,方法等)都应该是生成的代码的一部分。所有其他的东西都被解雇了。

注意:特定方法的实现应该是结果代码的一部分。应导入所有使用的类型,......

有关如何使用此项目的任何提示:https://today.java.net/pub/a/today/2008/04/10/source-code-analysis-using-java-6-compiler-apis.html#accessing-the-abstract-syntax-tree-the-compiler-tree-api

祝你好运

4 个答案:

答案 0 :(得分:1)

执行此类操作的标准方法是将程序解析为某些AST(例如,使用您提到的API),然后以您希望的任何方式修改AST - 例如,过滤掉没有注释的方面 - 最后,创建一些可以将AST打印回源代码表单的访问者。虽然您丢失了源格式,但这种方式应该可行。此外,创建打印回源代码访问者是一件非常繁琐的事。

或者,您可以使用现有库进行Java源代码转换(可能与上述方法相同),例如Spoon。具体而言,here's a Spoon filter which only matches elements with a given annotation - 正是您正在寻找的。

答案 1 :(得分:1)

Java 6.0有Annotation Processing API,可以通过编译器调用。此API允许您创建自定义Annotation Processors,它可以遍历代表您带注释的类的Java Mirror树。虽然它很复杂,但可以利用它来处理和生成新的源文件。

我已广泛使用它来生成源文件(Java-to-Java和Java-to-Python),并对它印象深刻。

以下是一些可能有助于您入门的链接:

答案 2 :(得分:0)

你可以简单地编写和编译一个java应用程序,它将未编译的类.java作为文本读取,并根据@或选择不影响代码的注释中的任何特殊字符选择所需的代码,然后将转换后的代码重新写入另一个file.java然后编译它。

答案 3 :(得分:0)

JavaForger解析现有源代码并基于模板生成新代码。下面的模板将生成您请求的代码。

class ${class.name} {

<#list fields as field>
<#if field.annotations?seq_contains("A")>
  ${field}; 
</#if>
</#list>

}

该项目可以在github上找到:https://github.com/daanvdh/JavaForger

已解析的变量列表可以在这里找到:https://github.com/daanvdh/JavaForger/blob/master/TemplateVariables.md