官术网_书友最值得收藏!

解析版本號

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結構

主站蜘蛛池模板: 台安县| 达日县| 惠东县| 陇南市| 凤城市| 盖州市| 苗栗县| 汉寿县| 固原市| 海晏县| 巴塘县| 嘉鱼县| 江川县| 盐亭县| 黄石市| 永定县| 曲阜市| 肇州县| 大城县| 宜兰市| 高要市| 泗阳县| 永昌县| 尤溪县| 香格里拉县| 仙游县| 永济市| 楚雄市| 平谷区| 东阳市| 兴宁市| 贺州市| 田林县| 策勒县| 偏关县| 延寿县| 高淳县| 泰来县| 界首市| 西丰县| 平潭县|