自动生成Java源代码

| 我正在寻找一种基于类中定义的字段为现有Java源代码文件中的新方法自动生成源代码的方法。 本质上,我希望执行以下步骤: 读取并解析
SomeClass.java
遍历源代码中定义的所有字段 添加源代码方法
someMethod()
保存
SomeClass.java
(理想情况下,保留现有代码的格式) 哪些工具和技术最适合完成此任务? 编辑 我不想在运行时生成代码;我想扩充现有的Java源代码     
已邀请:
用自动生成的代码修改相同的Java源文件是维护的噩梦。考虑生成一个新类,以扩展您当前的类并添加所需的方法。使用反射从用户定义的类读取并为自动生成的类创建速度模板。然后为每个用户定义的类生成其扩展类。将代码生成阶段集成到构建生命周期中。 或者,您可以使用“字节码增强”技术来增强类,而无需修改源代码。 更新: 混合自动生成的代码总是会冒着将来有人修改它来调整小行为的风险。当这些更改将丢失时,这只是下一个构建的问题。 您将只能依靠自动生成的源代码上的注释来防止开发人员这样做。 版本控制-假设您更新了someMethod()的模板,即使源更新是自动生成的,现在所有源文件的版本也会被更新。您将看到多余的历史记录。     
您想要的是一个程序转换系统。 好的有针对您所关心语言的解析器,为表示所解析的代码的程序构建AST,为您提供对AST的访问以进行分析和修改,并可以从AST重新生成源文本。您对“扫描字段”的评论只是对代表程序的AST的一种遍历。对于您产生的每个有趣的分析结果,您都想对AST进行更改,也许要在其他地方进行更改,但是仍然要在AST中进行更改。 在完成所有调试后,您想重新生成带有注释的文本(如原始输入的内容或新代码中的构造内容)。 有几种工具专门针对Java执行此操作。 Jackpot提供了一个解析器,构建了AST,并允许您对Java过程进行编码以对树进行操作。上行空间:从概念上讲容易。缺点:您编写的Java代码比您期望的要多得多,可以爬到树上/在树上乱砍。 Jackpot仅适用于Java。 Stratego和TXL解析您的代码,构建AST,并让您编写“从源到源”的转换(在这种情况下使用目标语言的语法,例如Java)来表达模式和修复。另一个好消息:您可以将自己喜欢的任何编程语言定义为要处理的目标语言,并且两者都具有Java定义。 但是它们的分析能力很弱:经常需要符号表和数据流分析才能真正进行所需的分析和更改。他们坚持认为,一切都是重写规则,无论对您有没有帮助。这有点像坚持在工具箱中只需要一把锤子。毕竟,一切都可以像指甲一样对待,对吗? 我们的DMS软件再造工具包允许定义任意目标语言(并具有许多预定义的语言,包括Java),包括Stratego,TXL的所有源到源转换功能,Jackpot的程序功能, 并另外提供符号表,控制和数据流分析信息。编译器人员教给我们这些东西对于构建强大的编译器是必需的(=“分析+优化+优化”),并且出于完全相同的原因,代码生成系统也是如此。使用这种方法,您可以生成代码并将其优化到您知道的程度。一个类似于您的序列化思想的示例是为指定的XML DTD生成快速的XML读取器和写入器。我们已经使用DMS for Java和COBOL做到了这一点。 DMS已用于读取/修改/写入许多类型的源文件。可以在此技术论文中找到一个很好的示例,使您的想法清晰明了,该示例说明了如何修改代码以插入检测探针:简化分支覆盖。 有关如何定义任意语言和变换的更简单但更完整的示例,可以在如何使用相同的思想变换代数中找到。     
看看Java Emitter模板。它们允许您使用标记语言创建Java源文件。它类似于使用脚本语言吐出HTML的方式,只是吐出了可编译的源代码。 JET的语法与JSP非常相似,因此不太难掌握。但是,这对于您要完成的工作可能是一个过大的杀伤力。如果您决定走这条路,那么这里有一些资源: http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html http://www.ibm.com/developerworks/library/os-ecemf2 http://www.vogella.de/articles/EclipseJET/article.html     
您可以使用cglib在运行时生成代码。     
遍历字段并定义someMethod是一个非常模糊的问题陈述,因此很难为您提供非常有用的答案,但是Eclipse的重构支持提供了一些出色的工具。它会为您提供构造函数,这些构造函数将初始化一组选定的已定义成员,并且还将为您定义toString方法。 我不知道您要考虑其他的someMethod(),但是您可以从这里开始。     
我会非常谨慎地将生成的代码注入到包含手写代码的文件中。手写代码应检入版本控制,但不应生成。代码生成应在构建过程中完成。您必须对构建过程进行结构设计,以便为每个文件制作一个临时副本,将生成的源代码注入其中,然后编译结果,而无需接触开发人员要处理的原始源文件。     
Antlr确实是一个很棒的工具,可以很容易地用于将Java源代码转换为Java源代码。     

要回复问题请先登录注册