簡體   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