亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java代碼分析器(一): JDT入門

binaryTree / 3950人閱讀

摘要:另載于這是一個(gè)關(guān)于抽象語法樹的故事。抽象語法樹是對(duì)程序代碼的結(jié)構(gòu)化表示,是對(duì)代碼進(jìn)行詞法分析語法分析后得到的產(chǎn)物。

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

這是一個(gè)關(guān)于抽象語法樹(Abstract Syntax Tree, AST)的故事。

抽象語法樹是對(duì)程序代碼的結(jié)構(gòu)化表示,是對(duì)代碼進(jìn)行詞法分析、語法分析后得到的產(chǎn)物。編譯器要用到它,很多生產(chǎn)力工具也要用它,例如:

IDE可以自動(dòng)重構(gòu)、自動(dòng)生成一些代碼、自動(dòng)對(duì)不規(guī)范代碼發(fā)出警告。這是很強(qiáng)很實(shí)惠的功能。

一個(gè)大型軟件項(xiàng)目常常有幾百人合作,幾百萬行代碼。很多代碼規(guī)范難以百分百落實(shí),很多編程錯(cuò)誤潛藏在項(xiàng)目中。這時(shí)候我們會(huì)考慮Sonar, FindBug, Checkstyle之類的代碼分析工具來幫助我們掃描出巨量代碼中存在的問題。

國(guó)內(nèi)有位老兄就做了個(gè)自動(dòng)生成測(cè)試代碼的工具。(但不要生成功能代碼,我們要構(gòu)建良好的抽象和簡(jiǎn)潔的代碼)

我司的系統(tǒng)要進(jìn)行架構(gòu)遷移,其中有百萬行代碼需要修改,用人力來做是很可怕的。我做了個(gè)工具來自動(dòng)完成這件事。

它們利用AST來對(duì)大量程序代碼做自動(dòng)化處理,給了我們莫大的幫助。甚至自動(dòng)寫代碼也不是不可能。那么我們自己能玩一玩AST這種高大上的東西嗎?

能。Eclipse這個(gè)開源的Java IDE就提供了一個(gè)庫來幫助我們達(dá)到目的,它的名字是JDT(Java Development Tools)。我們使用它的核心模塊JDT Core。

這個(gè)項(xiàng)目歷史悠久,功能強(qiáng)力,早期開發(fā)者有《設(shè)計(jì)模式》GoF的作者。

它提供了一套關(guān)于AST的API,能解析Java代碼,生成、分析和操作AST結(jié)構(gòu)。有了它,我們就不用自己實(shí)現(xiàn)高難度的詞法分析和語法分析了。

動(dòng)手搞起

(嫌麻煩可以看這個(gè)小框架 https://github.com/sorra/exia)
首先準(zhǔn)備好庫文件——打開你的Eclipse安裝目錄,在搜索框中搜索以下jar文件(*是通配符):
org.eclipse.jdt.core_*
org.eclipse.core.contenttype_*
org.eclipse.core.jobs_*
org.eclipse.core.resources_*
org.eclipse.core.runtime_*
org.eclipse.equinox.common_*
org.eclipse.equinox.preferences_*
org.eclipse.equinox.registry_*
org.eclipse.osgi_*
org.eclipse.text_*
如果有多個(gè)版本,取最新版本。統(tǒng)統(tǒng)copy出來,添加到你的項(xiàng)目中。
源代碼包是org.eclipse.jdt.core.source_* 用Eclipse的Attach source功能把它連到第一個(gè)jar上,可以閱讀源代碼。

先來溜一段起步代碼,把一段Java代碼解析成AST。

import java.util.Map;
import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.JavaCore;
......
public static void main(String[] args) {
    ASTParser parser = ASTParser.newParser(AST.JLS4); //設(shè)置Java語言規(guī)范版本
    parser.setKind(ASTParser.K_COMPILATION_UNIT);

    Map compilerOptions = JavaCore.getOptions();
    compilerOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7); //設(shè)置Java語言版本
    compilerOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7);
    compilerOptions.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);
    parser.setCompilerOptions(compilerOptions); //設(shè)置編譯選項(xiàng)

    char[] src = "class A { void method1(int b){;} }".toCharArray();
    parser.setSource(src);

    CompilationUnit cu = (CompilationUnit) parser.createAST(null); //這個(gè)參數(shù)是IProgessMonitor,用于GUI的進(jìn)度顯示,我們不需要,填個(gè)null. 返回值是AST的根結(jié)點(diǎn)

    System.out.println(cu); //把AST直接輸出看看啥樣
}

AST作為抽象語法樹,它就是一棵樹,有點(diǎn)像XML的DOM樹。
例子中的樹大概長(zhǎng)這樣:

CompilationUnit
       |
     class
    |     |
    A   method1
       |   |   |
     void []   {}
           |   |
          arg  ;
         |  |
        int b

延伸閱讀:http://help.eclipse.org/ 點(diǎn)擊JDT Plug-in User Guide -> Programmer"s Guide -> JDT Core。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64111.html

相關(guān)文章

  • Java代碼析器(二): 使用DOM API操作抽象語法樹

    摘要:請(qǐng)下載一份源代碼,這里有個(gè)對(duì)應(yīng)的源碼包元素的組合需要遵守基本的語法規(guī)則不是全部。名字也是表達(dá)式的一種,是指變量名類名包名等元素,它們?cè)谥卸紝儆诔橄箢?,分為和兩種具體類。 另載于 http://www.qingjingjie.com/blogs/3 上篇博客末尾提到了一棵抽象語法樹長(zhǎng)什么樣子。JDT提供了一套DOM API來讓我們順利地控制這樣一棵樹。 讀完本篇后請(qǐng)繼續(xù)完成上篇的延伸閱讀...

    pf_miles 評(píng)論0 收藏0
  • logback管理日志入門

    摘要:是由創(chuàng)始人設(shè)計(jì)的又一個(gè)開源日志組件。此外完整實(shí)現(xiàn)使你可以很方便地更換成其它日志系統(tǒng)如或。訪問模塊與容器集成提供通過來訪問日志的功能。依賴配置的核心,包建議使用來管理日志,方便替換底層實(shí)現(xiàn),要用,就在依賴中加入包和包。 Logback是由log4j創(chuàng)始人設(shè)計(jì)的又一個(gè)開源日志組件。logback當(dāng)前分成三個(gè)模塊:logback-core,logback-classic和logback-ac...

    bluesky 評(píng)論0 收藏0
  • Java代碼析器(三): 以強(qiáng)大的屬性描述符寫出通用代碼

    摘要:最后提供一段我用寫的代碼供參考行就能把任意代碼結(jié)構(gòu)轉(zhuǎn)換成輸出使用了庫利用強(qiáng)大的屬性描述符,寫出通用的轉(zhuǎn)換代碼,避免了給每個(gè)結(jié)點(diǎn)類寫對(duì)應(yīng)的轉(zhuǎn)換代碼幾十種結(jié)點(diǎn)類,要死啊。 另載于 http://www.qingjingjie.com/blogs/4 上篇介紹的形形色色的語法元素大概讓人眼花繚亂了,而且每種元素都對(duì)應(yīng)一個(gè)Java類。知道是一回事,使用就是另一回事了,這么多個(gè)類,要給每個(gè)類寫對(duì)...

    andot 評(píng)論0 收藏0
  • 分享代碼片段:如何對(duì)自動(dòng)生成的java代碼做自動(dòng)格式化,以達(dá)到接近手寫的效果

    摘要:原文鏈接如題,有的時(shí)候,我們會(huì)采用自動(dòng)生成代碼的方式來完成一些任務(wù),比如根據(jù)業(yè)務(wù)數(shù)據(jù)自動(dòng)生成調(diào)用的供用戶下載使用這樣自動(dòng)生成的代碼,如果未經(jīng)格式化處理,基本上是不可讀的正好,我們常用的,快捷鍵就能自動(dòng)格式化代碼那么,下面這段代碼,就是將的這 原文鏈接:https://gist.github.com/pfmiles/653c8b59e795698c867d 如題,有的時(shí)候,我們會(huì)采用自...

    lykops 評(píng)論0 收藏0
  • 使用JDK自帶的VisualVM進(jìn)行Java程序的性能分析

    摘要:是什么是自帶的一個(gè)用于程序性能分析的工具,安裝完畢后就有啦,在安裝目錄的文件夾下能找到名稱為。假設(shè)我自己實(shí)現(xiàn)了一個(gè)快速排序算法,我想測(cè)一測(cè)它的性能。首先我在下圖代碼第行執(zhí)行我的快速排序算法之處設(shè)置一個(gè)斷點(diǎn)?;氐?,按結(jié)束應(yīng)用程序的執(zhí)行。 VisualVM是什么? showImg(https://segmentfault.com/img/remote/1460000016730111); ...

    piapia 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<