## javaparser
### 使用Java Parser轉換生成AST
Java Parser轉換生成AST,有很多方法,主要支持兩大類方式:
**1)???? 輸入為文件**
輸入為文件,即針對完整的文件為輸入,生成整個文件的AST(對于Java來說,如果是整個Java文件,AST的根節點為CompilationUnit),這種方式,可以完整保留源碼的代碼行信息,這樣方便進行分析。對于文件為輸入,即輸入文件路徑(多種寫法,例如String、File、Path、Resource等,其實都是表示文件路徑),同時可以指定文件的編碼方式,下面的用例,指定的是nio的Path格式的路徑。
~~~javascript
// 1. 轉換的是完整的Java文件
File base = new File("");
String relativePath = "test-case/javaparser-testcase/src/main/java/zmj/test/thread/MyThread.java";
String absolutePath = base.getCanonicalPath() + File.separator + relativePath;
ParseResult<CompilationUnit> result = new JavaParser().parse(Paths.get(absolutePath));
result.getResult().ifPresent(YamlPrinter::print);
~~~
### AST


### 應用
#### 源碼間依賴關系分析
基于類型推斷獲取如下信息:
1)???? 當前類的父類或者父接口,并遞歸獲取所有的父類和父接口;
2)???? 獲取當前所調用函數的signature(函數簽名,包含可以唯一識別一個方法的所有信息,例如所在的類、名字、形參類型列表、返回值類型),從而拿到函數調用關系;
另外,再結合源碼文件和Java類定義的對應關系,可以很方便地構造出工程的CG圖,識別出源碼之間的依賴關系分析。
#### 代碼度量
實際上,基于Java Parser獲得的AST信息,輔助類型推斷特性,可以實現針對源代碼的各種度量內容。可以參考[https://www.exida.com/Blog/software-metrics-iso-26262-iec-61508](https://www.exida.com/Blog/software-metrics-iso-26262-iec-61508), 查看常見的代碼度量項。針對其中3.1所列出的所有的項都可以度量。
常見的一些度量項:
針對函數:圈復雜度、代碼深度、各類代碼行信息、調用函數數量、被調用次數、其他諸如入參個數…;
針對文件:總代碼行、空行、注釋行、非空非注釋行、代碼注釋密度…;
針對工程:文件總數、代碼行總數、平均代碼行…
基于Java Parser可以很好地進行實現,而且大部分都不需要完整的依賴信息,可以方便地進行度量。
#### Java規范支持檢查
當前,針對各類規范支持,可以在不同的層面上進行支持,例如直接對源碼檢查、對解析得到的Token進行檢查、對AST進行檢查、在CFG和CG上進行數據流檢查和各種形式化檢查等。
基于Java Parser,可以實現在AST及源碼(可以直接讀取源碼信息)、Token(從AST的節點可以獲取當前AST Node中的所有的Token)相結合的所有檢查。
例如,PMD主要是在AST上進行的檢查,CheckStyle主要是在Token和AST上進行的檢查,結合類型推斷的支持,Java Parser可以實現比PMD和CheckStyle更精確的檢查。
# 參考資料
[Java Parser應用介紹](https://cloud.tencent.com/developer/news/740798)
- Android
- 四大組件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介紹
- MessageQueue詳細
- 啟動流程
- 系統啟動流程
- 應用啟動流程
- Activity啟動流程
- View
- view繪制
- view事件傳遞
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大數據
- Binder小結
- Android組件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 遷移與修復
- Sqlite內核
- Sqlite優化v2
- sqlite索引
- sqlite之wal
- sqlite之鎖機制
- 網絡
- 基礎
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP進化圖
- HTTP小結
- 實踐
- 網絡優化
- Json
- ProtoBuffer
- 斷點續傳
- 性能
- 卡頓
- 卡頓監控
- ANR
- ANR監控
- 內存
- 內存問題與優化
- 圖片內存優化
- 線下內存監控
- 線上內存監控
- 啟動優化
- 死鎖監控
- 崩潰監控
- 包體積優化
- UI渲染優化
- UI常規優化
- I/O監控
- 電量監控
- 第三方框架
- 網絡框架
- Volley
- Okhttp
- 網絡框架n問
- OkHttp原理N問
- 設計模式
- EventBus
- Rxjava
- 圖片
- ImageWoker
- Gilde的優化
- APT
- 依賴注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 協程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 運行期Java-hook技術
- 編譯期hook
- ASM
- Transform增量編譯
- 運行期Native-hook技術
- 熱修復
- 插件化
- AAB
- Shadow
- 虛擬機
- 其他
- UI自動化
- JavaParser
- Android Line
- 編譯
- 疑難雜癥
- Android11滑動異常
- 方案
- 工業化
- 模塊化
- 隱私合規
- 動態化
- 項目管理
- 業務啟動優化
- 業務架構設計
- 性能優化case
- 性能優化-排查思路
- 性能優化-現有方案
- 登錄
- 搜索
- C++
- NDK入門
- 跨平臺
- H5
- Flutter
- Flutter 性能優化
- 數據跨平臺