Java 基于现有代码生成代码

Java 基于现有代码生成代码,java,abstract-syntax-tree,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; } 如您所见,使用自定义注释注释的所有内容(类、字段、方法等)都应该是结果代码的一部分。所有其他

我想生成基于现有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;
}
如您所见,使用自定义注释注释的所有内容(类、字段、方法等)都应该是结果代码的一部分。所有其他的东西都错过了

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

如何使用此项目的任何提示:

?


最好的问候

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


或者,您可以使用现有库进行Java源代码转换(其工作方式可能与上述相同),例如。具体来说,-正是您想要的。

您只需编写和编译一个java应用程序,将未编译的class.java作为文本读取,并根据@或注释中不影响代码的任何特殊字符选择所需代码,然后将转换后的代码重新写入另一个文件。java然后对其进行编译。

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

我已经在源文件生成(Java到Java和Java到Python)中广泛使用了它,对此印象深刻

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


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

class ${class.name} {

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

}
class${class.name}{
${field};
}
可以在github上找到该项目:


可以在这里找到解析变量列表:

发布的代码都不会编译。你为什么要这样做?@jlordo我认为这更像是一个示例,而不是实际的代码。无论如何,你应该看看Cup和JFlex。你至少可以用一个注释处理器来完成。这不是那么容易。。。看看上面的橡树。无意冒犯,但这不是Java noobies的问题。无论如何谢谢你!文本处理不足以处理类Java语言的源代码。如果不(至少)进行词法分析和解析,或者换句话说,构建一个AST,我看不到一个可行的方法,这确实是OP正在研究的。嗨,Oak,这可能是我正在寻找的(还不确定)。非常感谢。好啊我知道这是如何工作的(Java方面)。不幸的是,引导过程相当困难。有没有办法将spoon添加为依赖于maven的Y并从Java代码中引导它?我想将所有这些转换过程包装在一个自定义库中。@kalamar,我不知道;我从来没有实际使用过它,我只知道它适用于您感兴趣的各种操作。下面是一个有趣的项目:它是spoon的一个简单外观(引导过程)和一个示例(查看示例包)如何使用它。谢谢。我已经考虑过了。在我看来,这仍然很难处理。你有什么具体的例子吗?你知道,这是一个很好的问题,也是使用帕帕皮最困难的部分之一。具体和有用的例子有点难找到。我发布的链接有几个小例子(特别是最后一个),尽管它们可能有点难以应用于特定场景。不过,我确实认为值得努力学习:一旦掌握了镜像API以及在编译之前导航和遍历它的能力,就可以构建一些非常强大的源代码生成工具。