- Java虛擬機字節碼:從入門到實戰
- 吳就業
- 482字
- 2021-01-08 19:08:25
解析版本號
class文件結構的版本號分為主版本號和副版本號,它們共同構成class文件格式的版本號[1]。比如一個class文件的主版本號為56,副版本號為0,那么這個class文件結構的版本號就是52.0。副版本號在前,主版本號在后,分別占兩個字節。
版本號解析器的職責就是從class文件字節緩存中讀取出副版本號和主版本號。按順序讀取,先讀取兩個字節的副版本號,再讀取兩個字節的主版本號。版本號解析器的實現如代碼清單2-8所示。
代碼清單2-8 版本號解析器
public class VersionHandler implements BaseByteCodeHandler { // 版本號解析器排在魔數解析器的后面 @Override public int order() { return 1; } @Override public void read(ByteBuffer codeBuf, ClassFile classFile) throws Exception { // 讀取副版本號 U2 minorVersion = new U2(codeBuf.get(), codeBuf.get()); classFile.setMinor_version(minorVersion); // 讀取主版本號 U2 majorVersion = new U2(codeBuf.get(), codeBuf.get()); classFile.setMagor_version(majorVersion); } }
class文件格式的各版本號與JDK版本的對應關系如表2-9所示。
表2-9 各版本的對應關系

現在我們隨便找個class文件來編寫單元測試,驗證框架是否能正確解析出該class文件的魔數和版本號,單元測試如代碼清單2-10所示。
代碼清單2-10 魔數與版本號解析器單元測試
public class MagicAndVersionTest { @Test public void testMagicAndVersionHandler() throws Exception { // 將class文件讀取到ByteBuffer ByteBuffer codeBuf = ClassFileAnalysisMain.readFile("RecursionAlgorithmMain.class"); // 解析class文件 ClassFile classFile = ClassFileAnalysiser.analysis(codeBuf); System.out.println(classFile.getMagic().toHexString()); // 打印模數 System.out.println(classFile.getMinor_version().toInt()); // 打印副版本號 System.out.println(classFile.getMagor_version().toInt()); // 打印主版本號 } }
程序運行結果如圖2.3所示。

圖2.3 魔數與版本號解析器單元測試
注釋:
[1] 《Java虛擬機規范》Java SE8版本ClassFile結構
推薦閱讀
- JBoss Weld CDI for Java Platform
- FuelPHP Application Development Blueprints
- 程序員面試筆試寶典
- Building a RESTful Web Service with Spring
- TestNG Beginner's Guide
- Java從入門到精通(第5版)
- jQuery從入門到精通 (軟件開發視頻大講堂)
- Effective Python Penetration Testing
- Apex Design Patterns
- Drupal 8 Configuration Management
- 深入理解Android:Wi-Fi、NFC和GPS卷
- C語言程序設計教程
- Nginx Lua開發實戰
- Visual Basic程序設計(第三版)
- 一步一步跟我學Scratch3.0案例