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

資訊專欄INFORMATION COLUMN

Java代碼分析器(三): 以強大的屬性描述符寫出通用代碼

andot / 2924人閱讀

摘要:最后提供一段我用寫的代碼供參考行就能把任意代碼結(jié)構(gòu)轉(zhuǎn)換成輸出使用了庫利用強大的屬性描述符,寫出通用的轉(zhuǎn)換代碼,避免了給每個結(jié)點類寫對應(yīng)的轉(zhuǎn)換代碼幾十種結(jié)點類,要死啊。

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

上篇介紹的形形色色的語法元素大概讓人眼花繚亂了,而且每種元素都對應(yīng)一個Java類。知道是一回事,使用就是另一回事了,這么多個類,要給每個類寫對應(yīng)的處理代碼,不勝其煩。ASTVisitor雖然能自動遍歷語法樹,但是并不能幫你處理每一種結(jié)點。

好在JDT提供了更加抽象的屬性描述符(property descriptor),寥寥幾個類就能掌控所有Java語法。用術(shù)語來說,上篇的那些類屬于異構(gòu)AST,本篇講的是同構(gòu)AST。

對任何AST結(jié)點都可調(diào)用方法structuralPropertiesForType(),你會得到List,其中每一項都代表這個結(jié)點所屬的類的一個結(jié)構(gòu)性字段(就是跟AST有關(guān)的字段)。

StructuralPropertyDescriptor 是一個抽象類,有三個子類:SimplePropertyDescriptor, ChildPropertyDescriptor, ChildListPropertyDescriptor。這些東西是元數(shù)據(jù),用來描述各種語法元素的固有結(jié)構(gòu),使用它們有種在用Java反射的感覺。

SimplePropertyDescriptor 表示這個字段存放的不是AST結(jié)點,而是個值,可能是int, String,Operator之類的,SimplePropertyDescriptor.valueType 能告訴我們這個值是什么類型。

ChildPropertyDescriptor 表示這個字段存放的是一個AST結(jié)點,比如我們解析了一個class,得到typeDeclaration結(jié)點,然后調(diào)用typeDeclaration.structuralPropertiesForType(),得到的list中有一項就是typeName的描述符,嗯,就是AbstractTypeDeclaration類的typeName字段,字段類型為SimpleName。

ChildListPropertyDescriptor 表示這個字段存放的是一組AST結(jié)點! 比如AbstractTypeDeclaration擁有一組bodyDeclarations,而CompilationUnit則擁有一組imports。bodyDeclarations和imports都是List!

有了描述符能做什么呢? 可以自由訪問一棵語法樹了。

我們來想象一個流程:你有一個java文件,你把它交給JDT的parser,解析出一個CompilationUnit cu,也就是一棵語法樹的根結(jié)點。調(diào)用cu.structuralPropertiesForType(),得到描述符的list,循環(huán)遍歷list,對每個描述符prop,用instanceof判斷具體類型(總共就3個類型),分別做"不同處理"。

不同處理:instanceof操作發(fā)現(xiàn)某個描述符是ChildListPropertyDescriptor, 于是你把描述符強轉(zhuǎn)(cast)成該類型,調(diào)用prop.getId()得到"imports",哦,是imports字段啊,調(diào)用prop.getElementType()得到ImportDeclaration.class,確認了這一發(fā)現(xiàn)。然后你調(diào)用cu.getStructuralProperty(prop)得到一個object,你知道它實際是List,因此你將它強轉(zhuǎn)為這個List類型,遍歷它,對每個ImportDeclaration,調(diào)用getName().getFullyQualifiedName(),就得到了每個import的名稱。(當然,對ImportDeclaration也可以假裝不知道其類型,也用元數(shù)據(jù)來操控之)

由此你就完成了一個分析流程。因為不用關(guān)心具體的結(jié)點類型,所以你可以方便地進行一些宏觀、抽象的分析。

最后提供一段我用Scala寫的代碼供參考(50行就能把任意Java代碼結(jié)構(gòu)轉(zhuǎn)換成JSON輸出, 使用了lift json庫):
https://github.com/sorra/Lanka/blob/fa52cdaa2f94aadfcc29f8be2711a88da3c8cbb3/src/sorra/lanka/json/MetaConversion.scala
利用強大的屬性描述符,寫出通用的JSON轉(zhuǎn)換代碼,避免了給每個結(jié)點類寫對應(yīng)的JSON轉(zhuǎn)換代碼(幾十種結(jié)點類,要死啊)。

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

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

相關(guān)文章

  • 前端進階之路: 前端架構(gòu)設(shè)計(1)-代碼核心

    摘要:可能很多人和我一樣首次聽到前端架構(gòu)這個詞第一反應(yīng)是前端還有架構(gòu)這一說呢在后端開發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵因此架構(gòu)師備受重視早在開發(fā)工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵, 因此架構(gòu)師備...

    DevYK 評論0 收藏0
  • 前端進階之路: 前端架構(gòu)設(shè)計(1)-代碼核心

    摘要:可能很多人和我一樣首次聽到前端架構(gòu)這個詞第一反應(yīng)是前端還有架構(gòu)這一說呢在后端開發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵因此架構(gòu)師備受重視早在開發(fā)工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵, 因此架構(gòu)師備...

    baishancloud 評論0 收藏0
  • 前端進階之路: 前端架構(gòu)設(shè)計(1)-代碼核心

    摘要:可能很多人和我一樣首次聽到前端架構(gòu)這個詞第一反應(yīng)是前端還有架構(gòu)這一說呢在后端開發(fā)領(lǐng)域系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵因此架構(gòu)師備受重視早在開發(fā)工作啟動之前他們就被邀請加入到項目中而且他們會跟客戶討論即將建成的平臺的架構(gòu)要求使用還什么技術(shù)棧內(nèi)容類型 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴展性非常關(guān)鍵, 因此架構(gòu)師備...

    rockswang 評論0 收藏0
  • css選擇器效率分析

    摘要:選擇器的最后一部分,也就是選擇器的最右邊在這個例子中就是部分部分被稱為關(guān)鍵選擇器,它將決定你的選擇器的效率如何是高還是低。因為最右邊的關(guān)鍵選擇器是最具體的,也符合上述的選擇器優(yōu)先級順序。 贊助我以寫出更好的文章 如果您覺得文章對您有幫助,可以逐個點擊以下鏈接,類似于Google ads,不需要您付出任何費用,每天都可以來點一次噢,費用將由廣告商承擔,give me a cup of c...

    firim 評論0 收藏0

發(fā)表評論

0條評論

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