2

我想生成基于现有 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#访问抽象语法树编译器树 API

?

此致

4

4 回答 4

1

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

或者,您可以使用现有的库进行 Java 源代码转换(其工作方式可能与上述相同),例如Spoon。具体来说,这是一个 Spoon 过滤器,它只匹配具有给定注释的元素- 正是您正在寻找的。

于 2013-05-13T14:18:23.443 回答
1

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

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

以下是一些可以帮助您入门的链接:

于 2013-05-13T14:54:21.090 回答
0

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

于 2013-05-13T14:50:51.043 回答
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

于 2019-09-09T15:42:43.070 回答