自动生成Java源代码

Ton*_*ony 5 java code-generation

我正在寻找一种方法,根据类中定义的字段,自动为现有Java源代码文件中的新方法生成源代码.

本质上,我希望执行以下步骤:

  1. 阅读并解析 SomeClass.java
  2. 迭代源代码中定义的所有字段
  3. 添加源代码方法 someMethod()
  4. 保存SomeClass.java(理想情况下,保留现有代码的格式)

哪些工具和技术最适合完成此任务?

编辑

我不想在运行时生成代码; 我想扩充现有的Java 源代码

Ira*_*ter 12

你想要的是一个程序转换系统.

好的有你所关心语言的解析器,构建代表解析代码程序的AST,为你提供分析和修改的AST,并可以从AST重新生成源文本.你关于"扫描字段"的评论只是代表程序的AST的一种遍历.对于您生成的每个有趣的分析结果,您希望对AST进行更改,可能在其他位置,但仍然在AST中.在完成所有chagnes后,您需要使用注释(最初输入或在新代码中构建)重新生成文本.

有几种工具专门用于Java.

Jackpot提供了一个解析器,构建了AST,并允许您编写Java过程来对树进行所需的操作.好处:简单概念.缺点:你写了很多Java代码来爬树/砍伐树木而不是你期望的.Jackpot仅适用于Java.

西洋陆军棋通心络分析你的代码,生成的AST,让你写"surce -源"转换(使用目标语言的语法,例如,Java在这种情况下),表达模式和修复.其他好消息:您可以定义您喜欢的任何编程语言,作为要处理的目标语言,并且这两种语言都具有Java定义.但他们在分析方面很薄弱:通常需要符号表和数据流分析才能真正进行所需的分析和更改.而且他们坚持认为一切都是重写规则,无论是否有所帮助; 这有点像坚持你只需要工具箱中的锤子; 毕竟,一切都可以像钉子一样对待,对吧?

我们的DMS软件再造工具包 允许定义一个abitrary目标语言(并有许多预定义语言,包括Java),包括Stratego,TXL的所有源到源转换功能,Jackpot的程序功能,并另外提供符号表,控制和数据流分析信息.编译人员告诉我们,这些东西对于构建强大的编译器(="分析+优化+优化")是必要的,并且由于完全相同的原因,它也适用于代码生成系统.使用此方法,您可以生成代码并在您具备相关知识的范围内对其进行优化.类似于序列化思想的一个例子是为指定的XML DTD生成快速XML读取器和编写器; 我们已经使用DMS for Java和COBOL完成了这项工作.

DMS已用于读取/修改/写入多种源文件.可以在本技术论文中找到一个很好的例子,使这些想法变得清晰,该技术论文展示了如何修改代码以插入仪器探针: 分支覆盖变得容易.可以在如何使用相同的思想转换代数中找到一个更简单但更完整的定义应用于它的任意lanauges和变换的示例.


kda*_*bir 3

使用自动生成的代码修改同一个 java 源文件是维护的噩梦。考虑生成一个新类来扩展当前类并添加所需的方法。使用反射从用户定义的类中读取并为自动生成的类创建速度模板。然后为每个用户定义的类生成其扩展类。将代码生成阶段集成到构建生命周期中。

或者,您可以使用“字节码增强”技术来增强类,而无需修改源代码。

更新:

  1. 混合自动生成的代码总是会带来有人将来修改它以调整小行为的风险。这只是下一个版本的问题,届时这些更改将会丢失。
  2. 您将不得不仅依靠自动生成的源代码之上的注释来防止开发人员这样做。
  3. 版本控制 - 假设您更新了 someMethod() 的模板,现在所有源文件的版本都将更新,即使源更新是自动生成的。你会看到多余的历史。

  • 谢谢。我的想法是,注入自动生成的代码比字节码增强的“看不见的魔法”更清晰、更可维护,但我对我提出的方法的可维护性的细节感到好奇 (2认同)