我想生成基于现有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;
}
如您所见,使用自定义注释注释的所有内容(类,字段,方法等)都应该是生成的代码的一部分。所有其他的东西都被解雇了。
注意:特定方法的实现应该是结果代码的一部分。应导入所有使用的类型,......
祝你好运
答案 0 :(得分:1)
执行此类操作的标准方法是将程序解析为某些AST(例如,使用您提到的API),然后以您希望的任何方式修改AST - 例如,过滤掉没有注释的方面 - 最后,创建一些可以将AST打印回源代码表单的访问者。虽然您丢失了源格式,但这种方式应该可行。此外,创建打印回源代码访问者是一件非常繁琐的事。
或者,您可以使用现有库进行Java源代码转换(可能与上述方法相同),例如Spoon。具体而言,here's a Spoon filter which only matches elements with a given annotation - 正是您正在寻找的。 p>
答案 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