Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Eclipse JDT ASTRewrite作为独立应用程序以编程方式修改现有Java源代码_Java_Eclipse_Code Generation_Eclipse Jdt - Fatal编程技术网

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

使用Eclipse JDT ASTRewrite作为独立应用程序以编程方式修改现有Java源代码,java,eclipse,code-generation,eclipse-jdt,Java,Eclipse,Code Generation,Eclipse Jdt,我有一个现有的Java应用程序,其中包含我想通过编程修改的源文件。我需要能够对源文件进行分析,并在此基础上执行源转换。我还需要能够理解不同源文件之间的关系。我还想将此过程创建为一个独立的Java应用程序 通过做一些研究,我发现了以下工具:代码模型和EclipseJDT。我肯定还有其他人。我排除了代码模型,因为(据我所知)它只允许生成新的代码,而不能处理现有的代码 EclipseJDT库似乎满足了我的所有需求。我能够轻松地解析源文件。我可以配置绑定,以便跨类型保留信息。我现在面临的问题是如何让AS

我有一个现有的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
因此,我可以从独立应用程序中使用ASTRewrite功能,还是需要开始使用其他工具?

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

  • 对于类依赖项
  • 用于代码的分析
  • 我对
    JavaParser
    印象特别深刻,
    TattleTale
    做了我需要它做的事情
    JavaParser
    当然能够动态更改代码


    显然,您需要JAR和源代码,因为
    TattleTale
    可以在JAR上工作,而
    JavaParser
    可以与源代码一起工作。

  • 对于类依赖项
  • 用于代码的分析
  • 我对
    JavaParser
    印象特别深刻,
    TattleTale
    做了我需要它做的事情
    JavaParser
    当然能够动态更改代码


    显然,您需要JAR和源代码,因为
    TattleTale
    可以在JAR上工作,
    JavaParser
    可以与源代码一起工作。

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

    将整个java文件读入字符串并从中创建

    现在,您可以创建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();
    
    完成所有修改后,调用适当的重写方法,即:

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

    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文件读入字符串并从中创建

    现在,您可以创建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();
    
    完成所有修改后,调用适当的重写方法,即:

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

    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库