国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Class文件詳解 (1)

2019-11-18 14:50:50
字體:
來源:轉載
供稿:網友

  我們都知道,java編譯器負責將.java文件編譯成.class文件,class文件存儲的是java字節碼,與.java文件無關(只要你愿意寫一個編譯器,也可以將別的語言寫的源代碼編譯成.class文件),本文預備具體解剖class文件的內部結構,并且把class文件結構讀取并顯示出來。

Class文件的格式由JVM規范規定,一共有以下部分:
1. magic number,必須是0xCAFEBABE,用于快速識別是否是一個class文件。
2. version,包括major和minor,假如版本號超過了JVM的識別范圍,JVM將拒絕執行。
3. constant pool,常量池,存放所有用到的常量。
4. access flag,定義類的訪問權限。
5. this class和super class,指示如何找到this class和super class。
6. interfaces,存放所有interfaces。
7. fields,存放所有fields。
8. methods,存放所有methods。
9. attributes,存放所有attributes。

先寫一個Test.java:

package example.test;

public final class TestClass {
    public int id = 1234567;
    public void test() {}
}

然后編譯,放在C:/example/test/Test.class。

我們用Java來讀取和分析class,ClassAnalyzer的功能便是讀取Test.class,分析結構,然后顯示出來:

package classfile.format;

import java.io.*;

public class ClassAnalyzer {

    public static void main(String[] args) {
        DataInputStream input = null;
        try {
            input = new DataInputStream(new BufferedInputStream(new FileInputStream(
                "C://example//test//TestClass.class"
            )));
            analyze(input);
        }
        catch(Exception e) {
            System.out.        }
        finally {
            try { input.close(); } catch(Exception e) {}
        }
    }

    public static void analyze(DataInputStream input) throws IOException {
        // read magic number:
        int magic = input.readInt();
        if(magic==0xCAFEBABE)
            System.out.println("magic number = 0xCAFEBABE");
        else
            throw new RuntimeException("Invalid magic number!");
        // read minor version and major version:
        short minor_ver = input.readShort();
        short major_ver = input.readShort();
        System.out.println("Version = " + major_ver + "." + minor_ver);
        // read constant pool:
        short const_pool_count = input.readShort();
        System.out.println("constant pool size = " + const_pool_count);
        // read each constant:
        for(int i=1; i<const_pool_count; i++) {
            analyzeConstant(input, i);
        }
    }



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江陵县| 牙克石市| 刚察县| 阿城市| 洛浦县| 金山区| 乌鲁木齐市| 怀远县| 叙永县| 侯马市| 海伦市| 百色市| 聂荣县| 民勤县| 阜新| 柏乡县| 开鲁县| 武安市| 大荔县| 英山县| 青岛市| 崇信县| 宁河县| 汉川市| 西吉县| 登封市| 桦川县| 东源县| 舟曲县| 东乡| 日照市| 临武县| 麦盖提县| 平定县| 厦门市| 沧源| 文化| 湖北省| 阿克苏市| 安阳市| 大渡口区|