內(nèi)容介紹
這是一本揭示JVM字節(jié)碼“黑科技”的著作,它從原理和應(yīng)用兩個(gè)維度深入剖析了JVM字節(jié)碼。書中內(nèi)容涉及JVM字節(jié)碼的大部分應(yīng)用場(chǎng)景,如Java性能優(yōu)化、軟件防護(hù)與破解、APM等,通過大量實(shí)戰(zhàn)案例講解了它在這些場(chǎng)景中的實(shí)操技巧。
本書共 12 章,從邏輯上分為兩大部分。
第壹部分:原理篇(第1~8章)
第1章詳細(xì)剖析了class文件的內(nèi)部結(jié)構(gòu);第2章介紹了字節(jié)碼的概念以及Java虛擬機(jī)棧和棧幀的相關(guān)內(nèi)容;第3章介紹了字節(jié)碼的進(jìn)階知識(shí),包括泛型擦除、synchronized 關(guān)鍵字、反射的底層實(shí)現(xiàn)原理;第4章介紹了javac編譯器的原理,以及javac編譯的七大階段和各階段的作用;第5章從字節(jié)碼的角度介紹Kotlin的常見語(yǔ)法糖、coroutine 等原理;第6章介紹了ASM和Javassist這兩個(gè)字節(jié)碼操作工具;第7章介紹了Java Instrumentation的原理;第8章介紹了JSR 269 插件化注解處理原理。
第二部分:應(yīng)用篇(第9~12章)
第9章介紹了字節(jié)碼在cglib、Fastjson等框架上的應(yīng)用;第10章介紹了反編譯、破解、防破解和逆向工程的相關(guān)內(nèi)容;第11章介紹了APM的概況、分布式跟蹤的基本原理等。第12章詳細(xì)介紹了Android dex文件的組成結(jié)構(gòu),以及Android字節(jié)碼指令與Java字節(jié)碼指令的區(qū)別。
前 言
第1章 深入剖析 class 文件結(jié)構(gòu) 1
1.1 初探 class 文件 1
1.2 class 文件結(jié)構(gòu)剖析 3
1.2.1 魔數(shù) 4
1.2.2 版本號(hào) 6
1.2.3 常量池 7
1.2.4 Access flags 18
1.2.5 this_class、super_name、interfaces 19
1.2.6 字段表 20
1.2.7 方法表 23
1.2.8 屬性表 25
1.3 使用 javap 查看類文件 30
1.4 小結(jié) 32
第2章 字節(jié)碼基礎(chǔ) 33
2.1字節(jié)碼概述 33
2.2Java 虛擬機(jī)棧和棧幀 34
2.3 字節(jié)碼指令 41
2.3.1 加載和存儲(chǔ)指令 41
2.3.2 操作數(shù)棧指令 42
2.3.3 運(yùn)算和類型轉(zhuǎn)換指令 45
2.3.4 控制轉(zhuǎn)移指令 46
2.3.5 for語(yǔ)句的字節(jié)碼原理 48
2.3.6 switch-case底層實(shí)現(xiàn)原理 54
2.3.7 String的switch-case實(shí)現(xiàn)的字節(jié)碼原理 55
2.3.8 ++i和i++的字節(jié)碼原理 60
2.3.9 try-catch-finally的字節(jié)碼原理 63
2.3.10 try-with-resources 的字節(jié)碼原理 71
2.3.11 對(duì)象相關(guān)的字節(jié)碼指令 74
2.4 小結(jié) 77
第3章 字節(jié)碼進(jìn)階 78
3.1 方法調(diào)用指令 78
3.1.1 invokestatic指令 79
3.1.2 invokevirtual指令 79
3.1.3 invokespecial指令 80
3.1.4 invokeinterface指令 80
3.1.5 invokedynamic指令 90
3.2 Lambda 表達(dá)式的原理 95
3.3 泛型與字節(jié)碼 100
3.4 synchronized 的實(shí)現(xiàn)原理 102
3.5 反射的實(shí)現(xiàn)原理 106
3.5.1 反射方法源碼分析 107
3.5.2 反射的inflation機(jī)制 109
3.6 小結(jié) 110
第4章 javac 編譯原理簡(jiǎn)介 111
4.1 javac 源碼調(diào)試 112
4.2 javac 的七個(gè)階段 114
4.2.1 parse階段 115
4.2.2 enter階段 116
4.2.3 process階段 118
4.2.4 attr階段 118
4.2.5 flow階段 121
4.2.6 desugar階段 122
4.2.7 generate階段 126
4.3 小結(jié) 129
第5章 從字節(jié)碼角度看 Kotlin語(yǔ)言 130
5.1 Metadata 注解 130
5.2 頂層方法 132
5.3 object 單例 133
5.4 擴(kuò)展方法 134
5.5 接口默認(rèn)方法 135
5.6 默認(rèn)參數(shù) 137
5.7 高級(jí) for 循環(huán) 140
5.8 data class 142
5.9 多返回值 143
5.10 協(xié)程的實(shí)現(xiàn)原理 144
5.10.1 CPS 介紹 145
5.10.2 suspend 關(guān)鍵字 146
5.11 從字節(jié)碼分析 Kotlin 編譯器的bug 149
5.12 小結(jié) 153
第6章 ASM 和 Javassist 字節(jié)碼操作工具 154
6.1 ASM 介紹 154
6.1.1 ASM Core API核心類 156
6.1.2 ASM操作字節(jié)碼示例 158
6.2 Javassist 介紹 169
6.2.1 Javassist核心API 169
6.2.2 Javassist操作字節(jié)碼示例 170
6.3 小結(jié) 174
第7章 Java Instrumentation 原理 175
7.1 Java Instrumentation 簡(jiǎn)介 175
7.2 Instrumentation 與 -javaagent啟動(dòng)參數(shù) 176
7.3 JVM Attach API 介紹 180
7.3.1 JVM Attach API基本使用 181
7.3.2 JVM Attach API的底層原理 183
7.4 小結(jié) 190
第8章 JSR 269 插件化注解處理原理 191
8.1 JSR 269 簡(jiǎn)介 191
8.2 抽象語(yǔ)法樹操作 API 193
8.2.1 Names介紹 193
8.2.2 JCTree介紹 193
8.2.3 TreeMaker介紹 198
8.2.4 自定義注解處理實(shí)戰(zhàn) 202
8.3 JSR 269 在常用框架上的應(yīng)用 207
8.3.1 案例一:ButterKnife 207
8.3.2 案例二:Lombok 209
8.4 小結(jié) 212
第9章 字節(jié)碼的應(yīng)用 213
9.1 cglib 動(dòng)態(tài)代理原理分析 213
9.1.1 cglib核心API介紹 214
9.1.2 cglib原理分析 216
9.2字節(jié)碼在 Fastjson 上的應(yīng)用 218
9.3 字節(jié)碼在 Dubbo 上的應(yīng)用 221
9.4 字節(jié)碼在 JaCoCo 代碼覆蓋率上的應(yīng)用 222
9.5 字節(jié)碼在 Mock 上的應(yīng)用 225
9.6 小結(jié) 227
第10章 軟件破解和防破解 228
10.1 反編譯 228
10.2 軟件破解 229
10.2.1 破解方式一:直接修改class文件 230
10.2.2 破解方式二:javaagent無痛破解 232
10.3 軟件防破解 234
10.3.1 自定義ClassLoader 234
10.3.2 JNI隱藏核心邏輯 237
10.3.3 基于JVMTI的加密方案 239
10.3.4 混淆 245
10.4 小結(jié) 250
第11章 全鏈路分布式跟蹤與APM 251
11.1 全鏈路分布式跟蹤介紹 251
11.1.1 什么是全鏈路分布式跟蹤 252
11.1.2 OpenTracing基本術(shù)語(yǔ) 253
11.1.3 分布式跟蹤的實(shí)現(xiàn)和上下文傳遞 254
11.2 見微知著之 APM 260
11.2.1 APM基本概念 260
11.2.2 APM的字節(jié)碼注入實(shí)現(xiàn) 261
11.2.3 其他平臺(tái)的APM實(shí)現(xiàn) 272
11.3 小結(jié) 273
第12章 Android字節(jié)碼與 APM 274
12.1 dex 文件結(jié)構(gòu) 274
12.1.1 header 276
12.1.2 string_ids 278
12.1.3 type_ids 280
12.1.4 proto_ids 281
12.1.5 field_ids 282
12.1.6 method_ids 283
12.1.7 class_defs 284
12.1.8 data 288
12.1.9 link_data 288
12.2 Android字節(jié)碼 288
12.2.1 Android字節(jié)碼概述 288
12.2.2 常見的字節(jié)碼指令介紹 289
12.3 Gradle 插件編寫 295
12.3.1 自定義Gradle插件 295
12.3.2 獨(dú)立的 Gradle 插件項(xiàng)目 296
12.4 Android字節(jié)碼注入原理 297
12.4.1 Transform API介紹 297
12.4.2 字節(jié)碼注入代碼實(shí)現(xiàn) 299
12.5 小結(jié) 301