內容提要
- 類加載
- 方法句柄
- 解剖類文件
- JVM字節碼以及它的重要性
- 新的操作碼
invokedynamic
要成為優秀的Java開發人員,需要深入理解Java平台的工作方式。其中就包括類加載和JVM字節碼這樣的核心特性。
假設有一個大量使用依賴注入(DI)技術的應用程序,比如Spring,它在啟動時出了問題,報了一個神秘的錯誤信息。如果不是簡單的配置錯誤問題,你就需要瞭解如何實現DI框架才能跟蹤問題來源。也就是說你得明白類加載機制。
或者假定跟你合作的開發商跑路了,只給你留下了一堆編譯過的代碼,沒有源碼,文檔也亂七八糟的。你怎麼能知道編譯過的代碼包含了什麼呢?
最常見的程序啟動失敗錯誤就是ClassNotFoundException
或NoClassDefFoundError
,但很多開發人員都不知道它們是什麼,有什麼區別以及為什麼會出現。
本章重點就是這些與開發相關的平台特性。此外還會討論一些高級特性——它們是為Java的粉絲準備的,如果你時間有限,可以跳過那部分內容。
我們會從類加載的概覽開始,這是VM為運行中的程序定位和激活新類型的過程。其核心是在VM中表示類型的Class
對象。接下來我們會介紹一下新的方法句柄API,並和Java 6中已有的技術(比如反射)進行比較。
之後我們會討論檢查和分析類文件的工具。用Oracle JDK提供的javap
作為參考工具。上過類文件的解剖課後,我們會轉而討論字節碼,其中涉及JVM操作碼的主要體系以及運行時的底層操作。
在你用字節碼的知識把自己武裝起來之後,我們會深入探討invokedynamic
操作碼,它是Java 7新引入進來的,為的是讓非Java語言能充分利用JVM的平台特性。
我們先從類加載開始吧,這是一個將新的類合併到正在運行著的JVM進程中的過程。