繁体   English   中英

使用Eclipse JDT ASTRewrite以编程方式修改现有Java源代码作为独立应用程序

[英]Modify existing Java source programatically with Eclipse JDT ASTRewrite as a standalone application

我有一个现有的Java应用程序,其中包含我想要以编程方式修改的源文件。 我需要能够对源文件进行分析,并基于该分析执行源转换。 我还需要能够理解不同源文件之间的关系。 我也想将此过程创建为独立的Java应用程序。

经过一些研究,我发现了以下工具:代码模型和Eclipse JDT。 我敢肯定还有其他人。 我已经排除了代码模型,因为(据我所知)它仅允许生成新代码,而不能与现有代码一起使用。

Eclipse JDT库似乎可以满足我的所有需求。 我能够轻松解析源文件。 我可以配置绑定,以便保留跨类型的信息。 我现在遇到的问题是使ASTRewrite功能正常工作。 从我阅读的示例和文档中看来,它只能在eclipse插件中运行。 当我尝试使用重写器时,出现以下错误:

java.lang.IllegalArgumentException: This API can only be used if the AST is created from a compilation unit or class file

那么我可以在独立的应用程序中使用ASTRewrite功能,还是需要开始使用其他工具?

由于您没有提供任何代码,因此我无法给出确切的答案,但是ASTRewrite确实可以工作,即使它在Eclipse “生态系统”之外使用也是如此。 您很可能使用错误的方法将更改应用于AST。 为了使其工作,请执行以下操作

将整个Java文件读取为字符串,然后从中创建org.eclipse.jface.text.Document

final String source = FileUtils.readFileToString(javaSRC);
org.eclipse.jface.text.Document document = new org.eclipse.jface.text.Document(source);

现在,您可以创建ASTParserASTRewriter的实例,并为刚刚创建的文档设置解析器的源。

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();

完成所有修改后,调用适当的重写方法,即: public TextEdit rewriteAST(IDocument document,Map options)

之后,您可以应用更改,也可以(如果需要)将更改写回到文件中。

TextEdit edits = rewriter.rewriteAST(document,null);
edits.apply(document);
FileUtils.write(javaSRC, document.get());

顺便说一句:我已经用以下罐子测试了此代码:

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

我没有完成项目,但是我使用了一个概念验证工具:

  1. TattleTale用于类依赖。
  2. JavaParser用于分析代码。

我是特别深刻的印象JavaParserTattleTale做了什么,我需要做的事。 JavaParser当然能够即时更改代码。

显然,你既需要的罐子和来源TattleTale工作的罐子和JavaParser的工作原理与来源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM