成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java代碼分析器(四): 代碼改寫技術(shù)

沈建明 / 3529人閱讀

摘要:另載于一般的工具只能分析代碼,不能改變代碼,除了的重構(gòu)功能。這個小框架讓你看文章前就能上手,快速對代碼庫做分析改寫,性能很高下面介紹經(jīng)過驗證的具體技術(shù),能局部修改代碼,調(diào)就行了感謝。由于以上原因,這套便利的在不再保證支持。

另載于 http://www.qingjingjie.com/blogs/5

一般的工具只能分析代碼,不能改變代碼,除了IDE的重構(gòu)功能。但我們還是有辦法實現(xiàn)的。

不想讓黑科技失傳,趁著Java 7還在廣泛使用,趕緊寫下來(可能無法支持Java 8)。

這個小框架讓你看文章前就能上手,快速對代碼庫做分析/改寫,性能很高: https://github.com/sorra/exia

下面介紹經(jīng)過驗證的具體技術(shù),能局部修改代碼,調(diào)API就行了(感謝Eclipse)。文檔里很難查到這些,痛的回憶…… (有句名言說: 畫一條線值1美元,知道在哪畫線值9999美元。)

核心代碼如下:

import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.TextEdit;

CompilationUnit cu = parseAST(...); //parse方法參見系列文章
cu.recordModifications(); //開始記錄AST變化事件
doChangesOnAST(...); //直接在樹上改變結(jié)點,參見系列文章
Document document = new Document(content);
TextEdit edits = cu.rewrite(document, formatterOptions); //樹上的變化生成了像diff一樣的東西
edits.apply(document); //應(yīng)用diff
return document.get(); //得到新的代碼,未改動的部分幾乎都保持原樣

我用的formatterOptions:

    private static final Map formatterOptions = DefaultCodeFormatterConstants.getEclipseDefaultSettings();
    static {
        formatterOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7);
        formatterOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7);
        formatterOptions.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);
        formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE);
        formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, "2");
        formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT, "100");
        formatterOptions.put(DefaultCodeFormatterConstants.FORMATTER_JOIN_LINES_IN_COMMENTS, DefaultCodeFormatterConstants.FALSE);
        // change the option to wrap each enum constant on a new line
        formatterOptions.put(
            DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ENUM_CONSTANTS,
            DefaultCodeFormatterConstants.createAlignmentValue(
            true,
            DefaultCodeFormatterConstants.WRAP_ONE_PER_LINE,
            DefaultCodeFormatterConstants.INDENT_ON_COLUMN));
    }

如果改動幅度很大,被改的代碼可能會縮進混亂。忍一忍吧,這套API原本會把代碼改錯,我定位到bug,提給Eclipse,他們發(fā)現(xiàn)問題很深,最后沒什么辦法,只能犧牲縮進換來代碼正確性。

由于以上原因,這套便利的API在Java 8不再保證支持。據(jù)說只能用原始的ListRewrite來改代碼…… 珍惜著用吧。

最后再介紹兩個便利方法:

ASTNode#delete()
結(jié)點能把自身從樹上移除。調(diào)這個方法不需要知道parent結(jié)點的類型,用起來就知道方便了。

replaceNode
我仿寫的方法,能任意替換一個結(jié)點,不需要知道parent結(jié)點的類型。

    public static void replaceNode(ASTNode old, ASTNode neo) {
      StructuralPropertyDescriptor p = old.getLocationInParent();
      if (p == null) {
          // node is unparented
          return;
      }
      if (p.isChildProperty()) {
          old.getParent().setStructuralProperty(p, neo);
          return;
      }
      if (p.isChildListProperty()) {
          List l = (List) old.getParent().getStructuralProperty(p);
          l.set(l.indexOf(old), neo);
      }
    }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64352.html

相關(guān)文章

  • UAVStack的慢SQL數(shù)據(jù)庫監(jiān)控功能及其實現(xiàn)

    摘要:頁面展示的統(tǒng)計追蹤等信息則通過的接口獲取四功能展示數(shù)據(jù)庫監(jiān)控目前已實現(xiàn)的功能有分類統(tǒng)計數(shù)據(jù)庫連接池監(jiān)控慢耗時分布統(tǒng)計慢統(tǒng)計慢追蹤以及調(diào)用鏈日志關(guān)聯(lián)功能。 作者: 王林林 出處:UAVStack智能運維 來源:宜信技術(shù)學(xué)院技術(shù)沙龍001期|AI中臺:一種敏捷的智能業(yè)務(wù)支持方案|宜信技術(shù)沙龍 3月28日晚8點線上直播,點擊報名 UAVStack是一個全維監(jiān)控與應(yīng)用運維平臺。UAV.Mon...

    luodongseu 評論0 收藏0
  • 深入解析阿里Android熱修復(fù)技術(shù)原理

    摘要:不過它確實各方面都做了大量的優(yōu)化,本文中的很多知識點也來源于阿里的熱修復(fù)技術(shù)原理一書,本書值得一讀,里面就是基于框架來編排的。 前言;本文框架什么是熱修復(fù)?熱修復(fù)框架分類技術(shù)原理及特點Tinker框架解析各框架對比圖總結(jié)通過閱讀本文,你會對熱修復(fù)技術(shù)有更深的認知,本文會列出各類框架的優(yōu)缺點以及技術(shù)原理,文章末尾簡單描述一下Tinker的框架結(jié)構(gòu)。 一、什么是熱修復(fù)?1.正常開發(fā)流程showI...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

沈建明

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<