摘要:另載于一般的工具只能分析代碼,不能改變代碼,除了的重構功能。這個小框架讓你看文章前就能上手,快速對代碼庫做分析改寫,性能很高下面介紹經過驗證的具體技術,能局部修改代碼,調就行了感謝。由于以上原因,這套便利的在不再保證支持。
另載于 http://www.qingjingjie.com/blogs/5
一般的工具只能分析代碼,不能改變代碼,除了IDE的重構功能。但我們還是有辦法實現的。
不想讓黑科技失傳,趁著Java 7還在廣泛使用,趕緊寫下來(可能無法支持Java 8)。
這個小框架讓你看文章前就能上手,快速對代碼庫做分析/改寫,性能很高: https://github.com/sorra/exia
下面介紹經過驗證的具體技術,能局部修改代碼,調API就行了(感謝Eclipse)。文檔里很難查到這些,痛的回憶…… (有句名言說: 畫一條線值1美元,知道在哪畫線值9999美元。)
核心代碼如下:
import org.eclipse.jface.text.Document; import org.eclipse.text.edits.TextEdit; CompilationUnit cu = parseAST(...); //parse方法參見系列文章 cu.recordModifications(); //開始記錄AST變化事件 doChangesOnAST(...); //直接在樹上改變結點,參見系列文章 Document document = new Document(content); TextEdit edits = cu.rewrite(document, formatterOptions); //樹上的變化生成了像diff一樣的東西 edits.apply(document); //應用diff return document.get(); //得到新的代碼,未改動的部分幾乎都保持原樣
我用的formatterOptions:
private static final MapformatterOptions = 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,他們發現問題很深,最后沒什么辦法,只能犧牲縮進換來代碼正確性。
由于以上原因,這套便利的API在Java 8不再保證支持。據說只能用原始的ListRewrite來改代碼…… 珍惜著用吧。
最后再介紹兩個便利方法:
ASTNode#delete()
結點能把自身從樹上移除。調這個方法不需要知道parent結點的類型,用起來就知道方便了。
replaceNode
我仿寫的方法,能任意替換一個結點,不需要知道parent結點的類型。
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); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64352.html
摘要:頁面展示的統計追蹤等信息則通過的接口獲取四功能展示數據庫監控目前已實現的功能有分類統計數據庫連接池監控慢耗時分布統計慢統計慢追蹤以及調用鏈日志關聯功能。 作者: 王林林 出處:UAVStack智能運維 來源:宜信技術學院技術沙龍001期|AI中臺:一種敏捷的智能業務支持方案|宜信技術沙龍 3月28日晚8點線上直播,點擊報名 UAVStack是一個全維監控與應用運維平臺。UAV.Mon...
摘要:不過它確實各方面都做了大量的優化,本文中的很多知識點也來源于阿里的熱修復技術原理一書,本書值得一讀,里面就是基于框架來編排的。 前言;本文框架什么是熱修復?熱修復框架分類技術原理及特點Tinker框架解析各框架對比圖總結通過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各類框架的優缺點以及技術原理,文章末尾簡單描述一下Tinker的框架結構。 一、什么是熱修復?1.正常開發流程showI...
閱讀 994·2023-04-25 14:41
閱讀 2445·2021-09-28 09:35
閱讀 3619·2019-08-30 15:53
閱讀 1941·2019-08-29 15:26
閱讀 1060·2019-08-28 17:59
閱讀 4230·2019-08-26 13:45
閱讀 2835·2019-08-26 13:33
閱讀 1639·2019-08-26 11:46