使用Eclipse JDT ASTRewrite作为独立应用程序以编程方式修改现有Java源代码
我有一个现有的Java应用程序,其中包含我想通过编程修改的源文件。我需要能够对源文件进行分析,并在此基础上执行源转换。我还需要能够理解不同源文件之间的关系。我还想将此过程创建为一个独立的Java应用程序 通过做一些研究,我发现了以下工具:代码模型和EclipseJDT。我肯定还有其他人。我排除了代码模型,因为(据我所知)它只允许生成新的代码,而不能处理现有的代码 EclipseJDT库似乎满足了我的所有需求。我能够轻松地解析源文件。我可以配置绑定,以便跨类型保留信息。我现在面临的问题是如何让ASTRewrite功能发挥作用。看起来(从我阅读的示例和文档中)它只在eclipse插件中工作。当我尝试使用重写器时,出现以下错误: java.lang.IllegalArgumentException: This API can only be used if the AST is created from a compilation unit or class file java.lang.IllegalArgumentException:只有从编译单元或类文件创建AST时,才能使用此API使用Eclipse JDT ASTRewrite作为独立应用程序以编程方式修改现有Java源代码,java,eclipse,code-generation,eclipse-jdt,Java,Eclipse,Code Generation,Eclipse Jdt,我有一个现有的Java应用程序,其中包含我想通过编程修改的源文件。我需要能够对源文件进行分析,并在此基础上执行源转换。我还需要能够理解不同源文件之间的关系。我还想将此过程创建为一个独立的Java应用程序 通过做一些研究,我发现了以下工具:代码模型和EclipseJDT。我肯定还有其他人。我排除了代码模型,因为(据我所知)它只允许生成新的代码,而不能处理现有的代码 EclipseJDT库似乎满足了我的所有需求。我能够轻松地解析源文件。我可以配置绑定,以便跨类型保留信息。我现在面临的问题是如何让AS
因此,我可以从独立应用程序中使用ASTRewrite功能,还是需要开始使用其他工具?我没有完成该项目,但我使用了一个概念验证工具:
JavaParser
印象特别深刻,TattleTale
做了我需要它做的事情JavaParser
当然能够动态更改代码
显然,您需要JAR和源代码,因为
TattleTale
可以在JAR上工作,而JavaParser
可以与源代码一起工作。
JavaParser
印象特别深刻,TattleTale
做了我需要它做的事情JavaParser
当然能够动态更改代码
显然,您需要JAR和源代码,因为
TattleTale
可以在JAR上工作,JavaParser
可以与源代码一起工作。由于您没有提供任何代码,我无法给您一个明确的答案,但是ASTRewrite确实可以工作,即使它在Eclipse生态系统之外使用。
您很可能使用错误的方法在AST上应用更改。
为了使其工作,请执行以下操作
将整个java文件读入字符串并从中创建
现在,您可以创建ASTParser和ASTRewriter的实例,并将解析器的源设置为刚刚创建的文档
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(document.get().toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
ASTRewrite rewriter = ASTRewrite.create(cu.getAST());
cu.recordModifications();
完成所有修改后,调用适当的重写方法,即:
在此之后,您可以应用更改并(如果愿意)将更改写回文件
TextEdit edits = rewriter.rewriteAST(document,null);
edits.apply(document);
FileUtils.write(javaSRC, document.get());
顺便说一句:我已经用以下JAR测试了这段代码:
org.eclipse.osgi_3.8.2.v20130124-134944.jar
org.eclipse.jdt.core_3.8.3.v20130121-145325.jar
org.eclipse.equinox.preferences_3.5.1.v20121031-182809.jar
org.eclipse.equinox.common_3.6.100.v20120522-1841.jar
org.eclipse.core.runtime_3.8.0.v20120912-155025.jar
org.eclipse.core.resources_3.8.1.v20121114-124432.jar
org.eclipse.core.jobs_3.5.300.v20120912-155018.jar
org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar由于您没有提供任何代码,我无法给您一个明确的答案,但ASTRewrite确实可以工作,即使它在eclipse的“生态系统”之外使用。 您很可能使用错误的方法在AST上应用更改。 为了使其工作,请执行以下操作 将整个java文件读入字符串并从中创建 现在,您可以创建ASTParser和ASTRewriter的实例,并将解析器的源设置为刚刚创建的文档
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(document.get().toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
ASTRewrite rewriter = ASTRewrite.create(cu.getAST());
cu.recordModifications();
完成所有修改后,调用适当的重写方法,即:
在此之后,您可以应用更改并(如果愿意)将更改写回文件
TextEdit edits = rewriter.rewriteAST(document,null);
edits.apply(document);
FileUtils.write(javaSRC, document.get());
顺便说一句:我已经用以下JAR测试了这段代码:
org.eclipse.osgi_3.8.2.v20130124-134944.jar
org.eclipse.jdt.core_3.8.3.v20130121-145325.jar
org.eclipse.equinox.preferences_3.5.1.v20121031-182809.jar
org.eclipse.equinox.common_3.6.100.v20120522-1841.jar
org.eclipse.core.runtime_3.8.0.v20120912-155025.jar
org.eclipse.core.resources_3.8.1.v20121114-124432.jar
org.eclipse.core.jobs_3.5.300.v20120912-155018.jar
org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar我查看了Java解析器,它似乎只支持Java1.5源代码。你知道它是否支持1.6吗?我已经使用JavaParser有一段时间了,与eclipse工具相比,我对它非常满意。它是一个快速简单的API。到目前为止唯一的缺点是缺少像eclipse这样的绑定支持。我还没有玩过TattleTale,我看过Java解析器,它似乎只支持Java1.5源代码。你知道它是否支持1.6吗?我已经使用JavaParser有一段时间了,与eclipse工具相比,我对它非常满意。它是一个快速简单的API。到目前为止唯一的缺点是缺少像eclipse这样的绑定支持。我还没有玩过TattleTale。我很高兴听到EclipseAST重写器在插件之外工作。这个API让人望而生畏,因为我对它并不熟悉。然而,它似乎非常有能力。我最终使用了JavaParser库,这让我非常接近,因为我正在编写一个代码迁移实用程序,但没有使用JavaParser库