[英]Use JDT to extract IcompilationUnits in a standalone Java application
[英]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);
现在,您可以创建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();
完成所有修改后,调用适当的重写方法,即: 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
我没有完成项目,但是我使用了一个概念验证工具:
我是特别深刻的印象JavaParser
和TattleTale
做了什么,我需要做的事。 JavaParser
当然能够即时更改代码。
显然,你既需要的罐子和来源TattleTale
工作的罐子和JavaParser
的工作原理与来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.