前言
第1章 Javac介紹 1
1.1 初識Javac 1
1.2 Javac源碼與調試 4
1.3 Javac命令 7
第2章 Javac文件係統 12
2.1 文件相關實現類 12
2.2 文件的管理 25
2.2.1 獲取JavacFileManager對象 25
2.2.2 StandardLocation類 28
2.2.3 JavacFileManager類 31
第3章 詞法分析 38
3.1 字符編碼 38
3.2 獲取字符輸入流 40
3.3 Token與Name 43
3.3.1 Token介紹 44
3.3.2 Name對象的生成與存儲 47
3.3.3 Name映射為Token 51
3.4 生成Token流 52
第4章 語法分析之認識樹節點 67
4.1 定義及聲明 68
4.1.1 JCCompilationUnit類 68
4.1.2 JCImport類 69
4.1.3 JCClassDecl類 70
4.1.4 JCModifiers類 71
4.1.5 JCTypeParameter類 72
4.1.6 JCVariableDecl類 72
4.1.7 JCMethodDecl類 74
4.2 語句 75
4.2.1 JCBlock類 75
4.2.2 JCIf類 76
4.2.3 JCWhileLoop、JCDoWhileLoop、JCForLoop與JCEnhancedForLoop類 78
4.2.4 JCSwitch與JCCase類 79
4.2.5 JCTry、JCCatch與JCThrow類 81
4.2.6 JCLabeledStatement、JCReturn、JCContinue與JCBreak類 82
4.2.7 JCSynchronized類 83
4.2.8 JCAssert類 83
4.3 錶達式 83
4.3.1 基本錶達式 84
4.3.2 含運算符的錶達式 88
4.3.3 類型相關錶達式 94
4.3.4 注解錶達式 97
4.4 生成樹節點 98
第5章 語法分析之建立抽象語法樹 101
5.1 定義及聲明的抽象語法樹 101
5.2 語句的抽象語法樹 112
5.3 錶達式的抽象語法樹 121
5.3.1 基本錶達式 122
5.3.2 含有運算符的錶達式 134
5.4 遍曆抽象語法樹 140
第6章 符號錶的組織 143
6.1 符號的定義 143
6.1.1 Symbol類 144
6.1.2 TypeSymbol及其子類 150
6.1.3 VarSymbol類 154
6.1.4 MethodSymbol及OperatorSymbol類 154
6.2 符號錶的組織 160
6.2.1 Env類介紹 160
6.2.2 AttrContext類介紹 162
6.2.3 Scope類介紹 163
6.2.4 符號錶的建立 164
6.3 類型的定義 169
6.3.1 普通類型的定義 169
6.3.2 泛型相關類型的定義 175
第7章 填充符號錶 180
7.1 依賴的處理 180
7.1.1 創建包或類符號 180
7.1.2 輸入包或類下的成員符號 184
7.2 符號輸入的第一階段 189
7.2.1 Enter類 190
7.2.2 visitTopLevel()方法 192
7.2.3 visitClassDef()方法 193
7.2.4 visitTypeParameter()方法 196
7.3 符號輸入第二階段 197
7.3.1 MemberEnter類 197
7.3.2 visitImport()方法 200
7.3.3 visitMethodDef()方法 207
7.3.4 visitVarDef()方法 209
第8章 插入式注解的實現 211
8.1 注解處理器基礎 211
8.1.1 編寫注解處理器 211
8.1.2 注解配置 215
8.1.3 工具類 215
8.2 初始化注解處理器 222
8.3 運行注解處理器 226
第9章 語義分析之類型轉換 233
9.1 類型轉換的種類 233
9.2 賦值轉換 245
9.3 方法調用轉換 253
9.4 強製類型轉換 254
9.5 數字提升 266
第10章 語義分析之語法檢查 269
10.1 類型定義的檢查 269
10.1.1 父類及實現接口的檢查 269
10.1.2 類型定義的唯一性檢查 273
10.1.3 類型中方法的兼容性檢查 276
10.1.4 類型中實現方法的檢查 287
10.2 變量定義的檢查 294
10.3 方法定義的檢查 296
10.3.1 方法的唯一性檢查 296
10.3.2 方法的隱藏 298
10.3.3 方法的覆寫 303
第11章 語義分析之引用消解 307
11.1 Resolve類介紹 307
11.2 類型引用的消解 310
11.3 變量引用的消解 320
11.4 方法引用的消解 323
第12章 語義分析之語法樹標注 345
12.1 Attr類介紹 346
12.2 錶達式相關樹節點的標注 348
12.2.1 JCUnary樹節點標注 348
12.2.2 JCBinary樹節點的標注 350
12.2.3 JCAssignOp樹節點的標注 351
12.3 JCIdent樹節點的標注 351
12.4 JCFieldAccess樹節點的標注 354
第13章 泛型的實現 361
13.1 泛型類型 361
13.2 泛型方法 364
13.2.1 類型推斷 365
13.2.2 鑽石語法 383
13.3 泛型擦除 386
第14章 數據流檢查 396
14.1 Flow類介紹 396
14.1.1 語句的活躍性分析 396
14.1.2 變量賦值檢查 398
14.1.3 異常檢查 405
14.2 if語句的分析 405
14.2.1 if語句 405
14.2.2 一元錶達式與if語句 409
14.2.3 二元錶達式與if語句 410
14.2.4 三元錶達式與if語句 412
14.3 循環語句的分析 413
14.3.1 for語句 413
14.3.2 中斷循環語句 416
14.4 try語句與throw語句的分析 419
14.4.1 拋齣異常 419
14.4.2 異常檢查 424
14.4.3 變量賦值狀態及語句的活躍性 430
第15章 語法糖去除 435
15.1 簡單語法糖 436
15.1.1 變長參數 436
15.1.2 條件編譯 437
15.1.3 自動裝箱與拆箱 438
15.2 語句語法糖 440
15.2.1 foreach語句 440
15.2.2 switch語句 442
15.2.3 try-with-resources語句 447
15.3 枚舉類語法糖 452
15.4 內部類語法糖 453
15.4.1 調用私有構造方法 454
15.4.2 引用成員 457
15.4.3 super關鍵字引用父類成員 470
15.4.4 訪問自由變量 472
第16章 字節碼指令生成 486
16.1 字節碼指令集 486
16.2 生成字節碼指令 492
16.2.1 實現本地變量錶 492
16.2.2 實現操作數棧 495
16.2.3 常量池信息的存儲 497
16.2.4 Code類介紹 499
16.3 Gen類介紹 502
16.4 可尋址實體Item 506
16.4.1 LocalItem類 508
16.4.2 ImmediateItem類 512
16.4.3 StackItem類 514
16.4.4 AssignItem類 515
16.4.5 StaticItem類 517
16.4.6 MemberItem類 520
16.4.7 SelfItem類 523
16.4.8 IndexedItem類 524
第17章 重要結構的字節碼指令生成 527
17.1 控製轉移指令與地址迴填 527
17.1.1 認識控製轉移指令 527
17.1.2 地址迴填 529
17.2 語句的條件判斷錶達式 530
17.2.1 CondItem類 530
17.2.2 一元與二元條件判斷錶達式 533
17.2.3 三元條件判斷錶達式 534
17.3 if語句 536
17.4 循環語句 537
17.5 switch語句 539
17.6 異常與finally語句 545
17.6.1 異常的拋齣 545
17.6.2 異常的捕獲與finally語句 545
第18章 生成Class文件 553
18.1 Class文件的結構 553
18.2 魔數與版本 556
18.3 常量池 556
18.4 類定義的基本信息 562
18.4.1 訪問標識符 562
18.4.2 類、父類及接口集閤 564
18.5 字段集閤 565
18.6 方法集閤 570
18.7 類屬性集閤 575
18.8 描述符和簽名 581
18.8.1 描述符 581
18.8.2 簽名 582
18.8.3 描述符與簽名的實現 585
附錄A Javac命令 589
附錄B 文法 592
附錄C 類型常見操作 600
C.1 supertype()方法 600
C.2 interfaces()方法 604
C.3 asSuper()方法 606
C.4 asOuterSuper()方法 608
C.5 isSameType()方法 609
C.6 L()與U()方法 615
C.7 lowerBound()與upperBound()方法 616
C.8 containsType()方法 617
C.9 hasSameArgs()方法 621
C.10 subst()方法 623
C.11 memberType()方法 626
C.12 erasure()與erasureRecursive()方法 628
附錄D 符號常見操作 632
D.1 isInheritedIn()方法 632
D.2 hiddenIn()方法 633
D.3 isMemberOf()方法 634
D.4 overrides()方法 635
D.5 implementation()方法 639
附錄E 虛擬機字節碼指令錶 645
E.1 加載與存儲指令 645
E.2 運算指令 648
E.3 類型轉換指令 650
E.4 對象操作指令 651
E.5 操作數棧管理指令 652
E.6 控製轉移指令 652
E.7 方法調用和返迴指令 653
E.8 異常拋齣指令 654
E.9 同步指令 654
· · · · · · (
收起)