【问题标题】:Modify existing Java source programatically with Eclipse JDT ASTRewrite as a standalone application使用 Eclipse JDT AST Rewrite 作为独立应用程序以编程方式修改现有 Java 源代码
【发布时间】:2013-10-15 16:05:48
【问题描述】:

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

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

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

java.lang.IllegalArgumentException:只有当 AST 是从编译单元或类文件创建时,才能使用此 API

那么我可以从独立应用程序中使用 ASTRewrite 功能还是需要开始寻找不同的工具?

【问题讨论】:

    标签: java eclipse code-generation eclipse-jdt


    【解决方案1】:

    由于您没有提供任何代码,我无法给您一个明确的答案,但 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();
    

    完成所有修改后,调用正确的 rewrite 方法,即:public TextEdit rewriteAST(IDocument document,Map options)

    在此之后,您可以应用更改并(如果您愿意)也可以将更改写回文件。

    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

    【讨论】:

    • 我很高兴听到 eclipse AST 重写器在插件之外工作。该 API 看起来非常令人生畏,因为我不熟悉它。然而,它似乎非常有能力。我最终使用了 JavaParser 库,因为我正在编写一个代码迁移实用程序,并且不需要 100% 完美。
    • 我正在尝试类似的东西(无头使用 jdt),从最新的 eclipse 包中提取所有 jar。但是,我收到“org.eclipse.jface.text.Document 无法解析为类型”形式的错误。有什么想法吗?
    • 好吧,你还需要org.eclipse.text jar。添加该罐子解决了问题。
    • @Marek,我们能否使用上述技术在 java 源代码中添加一个新元素,例如 html 标签、private void hello(){ ;}?
    【解决方案2】:

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

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

    JavaParser 给我留下了特别深刻的印象,TattleTale 做了我需要它做的事情。 JavaParser 肯定能够即时更改代码。

    显然,您将需要 jar 和源,因为 TattleTale 在 jar 上工作,JavaParser 与源一起工作。

    【讨论】:

    • 我查看了 Java Parser,它似乎只支持 Java 1.5 源代码。不知道它是否支持1.6?
    • 我使用 JavaParser 已经有一段时间了,与 eclipse 工具相比,我对它非常满意。这是一个快速简单的 API。到目前为止唯一的缺点是缺乏像eclipse这样的绑定支持。我还没有玩过 TattleTale。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多