-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
12/1 新書到! 11/25 新書到! 11/17 新書到! 11/11 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

深入理解JVM字節碼

( 簡體 字)
作者:張亞類別:1. -> 程式設計 -> JAVA -> Java
譯者:
出版社:機械工業出版社深入理解JVM字節碼 3dWoo書號: 52776
詢問書籍請說出此書號!

有庫存
NT售價: 445

出版日:5/1/2020
頁數:300
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787111653721
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
作者序:

譯者序:

前言:

為什么要寫這本書

大約四五年前,秉承“代碼未動、監控先行”的理念,我開始在公司的平臺部門做服務質量監控平臺。最開始是使用人工埋點的方式來進行監控信息的上報,業務方的接入成本非常高,上線前需要花半天到一天的時間來進行埋點,苦不堪言。

后來公司大力推行 DevOps、容器化、微服務,提高了開發和運維效率,但分布式部署架構帶來的問題也迅速顯現出來,如服務拓撲不清、服務依賴關系復雜、日志散落在各個微服務中,等等。在出現問題時,開發人員不知道如何排查,無法快速定位問題。后來我了解到 javaagent + ASM 這樣的技術能夠自動注入埋點的代碼,于是花了大概一個月的時間苦學字節碼、ASM 相關的知識。ASM官方的英文手冊讀了不下 5 遍,深知其中的難點。另外,APM 這一套性能監控工具需要極高的可靠性和極低的性能損耗,倒逼著我對字節碼的執行原理、高性能 Java等有了更深入的研究。

我花了大概 3 個月的時間從零到一實現了整套無侵入字節碼注入 APM 系統,對整個后端微服務調用棧進行監控,實現了業務方零埋點、跨進程異構系統的調用鏈路追蹤、性能問題代碼級別定位、業務拓撲實時發現、SLA 實時統計等功能。該系統上線運行了幾年,至今未出現問題。

我平時喜歡破解一些軟件,一開始都是通過直接修改類文件的方式來進行的,比較煩瑣。掌握了 javaagent、ASM、JVMTI 這些工具以后,對軟件破解有了更深入的研究。

后來從平臺部門去業務部門帶領更大的團隊,很早期的時候就引入了 Kotlin 來進行后端開發。為了避免基礎較差的同事誤解語法糖的意思,我對 Kotlin 中很多語法背后的實現做了詳細的分析,讓他們在使用的時候更加清楚語法糖的實現原理。

一路走來,覺得越底層的知識越有價值,所以想寫一本這樣的書,讓更多的人能夠對 JVM 字節碼底層的細節多一些了解,在遇到問題時能自己分析、獨立判斷。

讀者對象

希望你可以通過閱讀本書知其然并知其所以然,理解炫酷語法糖和高級框架背后的實現原理,實現各種 JVM“黑科技”,真正搞懂反射、Lambda 表達式、AOP、熱加載、軟件破解等的實現細節。

本書適合以下讀者閱讀:

對 Java 有初步了解,想深入學習其內部運行細節的讀者;

通過學習字節碼改寫技術實現高性能框架的讀者;

對 APM 感興趣,想了解 APM 實現原理的讀者,以及準備搭建 APM 系統用來做分布式系統調用鏈跟蹤的讀者;

想學習 Java 軟件常見的破解和防破解方法,提高軟件逆向和破解水平的讀者。

如何閱讀這本書

本書一共 12 章,從邏輯上主要分為字節碼原理篇和應用篇兩大部分。

第 1 章詳細剖析了 class 文件的內部結構,幫助讀者理解本書后面介紹的字節碼原理。

第 2 章首先介紹了什么是字節碼,接下來介紹了 Java 虛擬機棧和棧幀的相關內容,然后通過 for 循環、switch-case、try-catch-finally 等語法講解了字節碼指令的用法。

第 3 章介紹了字節碼的進階知識,主要目的是讓讀者掌握方法調用指令、泛型擦除、synchronized 關鍵字、反射的底層實現原理。

第 4 章介紹了javac 編譯器的原理。編譯原理是計算機科學皇冠上的明珠,只有弄懂了 javac 才能更好地理解字節碼的生成原理。本章一開始介紹了 javac 源碼的調試方法,隨后詳細介紹了 javac 編譯的七大階段和各階段的作用。

第 5 章從字節碼角度看 Kotlin 語言,介紹了常見語法糖和協程等的原理,希望讀者在學習其他 JVM 系語言時可以舉一反三,使用類似的思路。

第 6 章介紹了 ASM 和 Javassist 兩個字節碼操作工具。這兩個工具非常重要,被廣泛用于中間件框架中,后面關于APM、軟件破解的章節都涉及這兩個工具的使用。

第 7 章介紹了 Java Instrumentation 的原理,分兩種方式講解了如何使用 Instrumentation,最后介紹了 Attach API 的底層 UNIX 域套接字的通信原理。

第 8 章介紹了 JSR 269 插件化注解處理的原理,希望讀者可以通過本章掌握編譯期間生成、修改代碼的方法,理解 Lombok、ButterKnife 工具的實現原理。

第 9 章主要介紹了字節碼在 cglib、Fastjson、Dubbo、JaCoCo、Mock 這些框架上的應用,可以讓讀者接觸到更多字節碼的使用場景。

第 10 章主要介紹了反編譯、破解、防破解和逆向工程的相關內容。了解常見的破解和逆向方法能更好地保護自己的軟件產品。

第 11 章介紹了 APM 的概況、分布式跟蹤的基本原理、OpenTracing 的基本概念和無埋點字節碼插樁的代碼實現。如果對 APM 有興趣,可以將本章作為入門指導,實現自己的 APM 產品。

第 12 章詳細介紹了Android dex 文件的組成結構,以及Android字節碼指令與 Java 字節碼指令的區別,最后介紹了 Gradle 字節碼改寫實現無侵入插樁的方法。

JVM 字節碼技術的內容非常龐大,本書只是揭開了冰山一角,希望可以達到授之以漁的目的。讀者如果可以通過閱讀本書掌握一些工具和方法,舉一反三地解決開發過程中的實際問題,那我就非常滿足了。

勘誤與支持

由于水平有限,書中難免存在一些錯誤或表述不嚴謹的地方,希望細心的讀者發現問題后能及時批評和指正。如有任何問題,可以發送郵件到。期待看到你的寶貴意見。

致謝

本書得以面世,首先要感謝機械工業出版社華章公司的楊福川老師,讓我有信心和勇氣去完成本書的全部內容,給了我很多寶貴的意見,使我受益匪淺。還要感謝出版社的李藝老師,在半年多的時間里花費了很多時間和精力閱讀、審校我的文稿,指出了很多隱藏的問題,非常專業。

在這大半年的時間里,在工作繁忙的同時要抽出時間來寫作,壓力非常大。感謝我的妻子在這段時間里對我的體諒和支持,讓我可以全身心地投入寫作中。
內容簡介:

這是一本揭示JVM字節碼“黑科技”的著作,它從原理和應用兩個維度深入剖析了JVM字節碼。書中內容涉及JVM字節碼的大部分應用場景,如Java性能優化、軟件防護與破解、APM等,通過大量實戰案例講解了它在這些場景中的實操技巧。

本書共 12 章,從邏輯上分為兩大部分。

第一部分:原理篇(第1~8章)

第1章詳細剖析了class文件的內部結構;第2章介紹了字節碼的概念以及Java虛擬機棧和棧幀的相關內容;第3章介紹了字節碼的進階知識,包括泛型擦除、synchronized關鍵字、反射的底層實現原理;第4章介紹了javac編譯器的原理,以及javac編譯的七大階段和各階段的作用;第5章從字節碼的角度介紹Kotlin的常見語法糖、coroutine等原理;第6章介紹了ASM和Javassist這兩個字節碼操作工具;第7章介紹了Java Instrumentation的原理;第8章介紹了JSR 269插件化注解處理原理。

第二部分:應用篇(第9~12章)

第9章介紹了字節碼在cglib、Fastjson等框架上的應用;第10章介紹了反編譯、破解、防破解和逆向工程的相關內容;第11章介紹了APM的概況、分布式跟蹤的基本原理等;第12章詳細介紹了Android dex文件的組成結構,以及Android字節碼指令與Java字節碼指令的區別。
目錄:

第1章 深入剖析 class 文件結構 1
1.1 初探 class 文件 1
1.2 class 文件結構剖析 3
1.2.1 魔數 4
1.2.2 版本號 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 小結 32
第2章 字節碼基礎 33
2.1字節碼概述 33
2.2Java 虛擬機棧和棧幀 34
2.3 字節碼指令 41
2.3.1 加載和存儲指令 41
2.3.2 操作數棧指令 42
2.3.3 運算和類型轉換指令 45
2.3.4 控制轉移指令 46
2.3.5 for語句的字節碼原理 48
2.3.6 switch-case底層實現原理 54
2.3.7 String的switch-case實現的字節碼原理 55
2.3.8 ++i和i++的字節碼原理 60
2.3.9 try-catch-finally的字節碼原理 63
2.3.10 try-with-resources 的字節碼原理 71
2.3.11 對象相關的字節碼指令 74
2.4 小結 77
第3章 字節碼進階 78
3.1 方法調用指令 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 表達式的原理 95
3.3 泛型與字節碼 100
3.4 synchronized 的實現原理 102
3.5 反射的實現原理 106
3.5.1 反射方法源碼分析 107
3.5.2 反射的inflation機制 109
3.6 小結 110
第4章 javac 編譯原理簡介 111
4.1 javac 源碼調試 112
4.2 javac 的七個階段 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 小結 129
第5章 從字節碼角度看 Kotlin語言 130
5.1 Metadata 注解 130
5.2 頂層方法 132
5.3 object 單例 133
5.4 擴展方法 134
5.5 接口默認方法 135
5.6 默認參數 137
5.7 高級 for 循環 140
5.8 data class 142
5.9 多返回值 143
5.10 協程的實現原理 144
5.10.1 CPS 介紹 145
5.10.2 suspend 關鍵字 146
5.11 從字節碼分析 Kotlin 編譯器的bug 149
5.12 小結 153
第6章 ASM 和 Javassist 字節碼操作工具 154
6.1 ASM 介紹 154
6.1.1 ASM Core API核心類 156
6.1.2 ASM操作字節碼示例 158
6.2 Javassist 介紹 169
6.2.1 Javassist核心API 169
6.2.2 Javassist操作字節碼示例 170
6.3 小結 174
第7章 Java Instrumentation 原理 175
7.1 Java Instrumentation 簡介 175
7.2 Instrumentation 與 -javaagent啟動參數 176
7.3 JVM Attach API 介紹 180
7.3.1 JVM Attach API基本使用 181
7.3.2 JVM Attach API的底層原理 183
7.4 小結 190
第8章 JSR 269 插件化注解處理原理 191
8.1 JSR 269 簡介 191
8.2 抽象語法樹操作 API 193
8.2.1 Names介紹 193
8.2.2 JCTree介紹 193
8.2.3 TreeMaker介紹 198
8.2.4 自定義注解處理實戰 202
8.3 JSR 269 在常用框架上的應用 207
8.3.1 案例一:ButterKnife 207
8.3.2 案例二:Lombok 209
8.4 小結 212
第9章 字節碼的應用 213
9.1 cglib 動態代理原理分析 213
9.1.1 cglib核心API介紹 214
9.1.2 cglib原理分析 216
9.2字節碼在 Fastjson 上的應用 218
9.3 字節碼在 Dubbo 上的應用 221
9.4 字節碼在 JaCoCo 代碼覆蓋率上的應用 222
9.5 字節碼在 Mock 上的應用 225
9.6 小結 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 小結 250
第11章 全鏈路分布式跟蹤與APM 251
11.1 全鏈路分布式跟蹤介紹 251
11.1.1 什么是全鏈路分布式跟蹤 252
11.1.2 OpenTracing基本術語 253
11.1.3 分布式跟蹤的實現和上下文傳遞 254
11.2 見微知著之 APM 260
11.2.1 APM基本概念 260
11.2.2 APM的字節碼注入實現 261
11.2.3 其他平臺的APM實現 272
11.3 小結 273
第12章 Android字節碼與 APM 274
12.1 dex 文件結構 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字節碼 288
12.2.1 Android字節碼概述 288
12.2.2 常見的字節碼指令介紹 289
12.3 Gradle 插件編寫 295
12.3.1 自定義Gradle插件 295
12.3.2 獨立的 Gradle 插件項目 296
12.4 Android字節碼注入原理 297
12.4.1 Transform API介紹 297
12.4.2 字節碼注入代碼實現 299
12.5 小結 301
序: