zoukankan      html  css  js  c++  java
  • OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码。

    为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构。

    于是,我就认真看了下OpenJDK中Java字节码文件的相关源码,结合大学期间对JVM的研究,参考JVM规范第2版(英文原版),特意整理下。

    JVM规范中定义的类文件的结构

    注:使用是类似于C语言的表示方法

    u1: unsigned one-byte  无符号一个字节

    u2: unsigned two-byte  无符号两个字节

    u4: unsigned four-byte 无符号四个字节

    ClassFiel{

     //魔法数字

     u4 magic;

     //次版本号

     u2 minor_version;

     //主版本号

     u2 major_version;

    //常量池中常量的个数

     u2 constant_pool_count;

     //常量池数组

    cp_info_constant_pool[constant_pool_count-1];

     //类或接口的访问标识符

     u2 access_flag;

     //这个类在常量池中的下标

     u2 this_class;

    //这个类的父类在常量池中的下标

    u2 super_class;

    //父接口的数量

    u2 interfaces_count;

    //父接口的数组

    u2 interfaces[interfaces_count];

    //字段的个数

    u2 fields_count;

    //字段的信息

    field_info fields[fields_count];

    //方法的个数

    u2 methods_count;

    //方法的信息

    method_info methods[methods_count];

    //属性的个数(不是字段)

    u2 attributes_count;

    //属性的信息,attribute_info是一种用来表示信息的结构

    attribute_info attributes[attributes_count];

     }

    OpenJDK中定义的类文件的结构

    public class ClassFile {

        public final int magic;
        public final int minor_version;
        public final int major_version;
        public final ConstantPool constant_pool;
        public final AccessFlags access_flags;
        public final int this_class;
        public final int super_class;
        public final int[] interfaces;
        public final Field[] fields;
        public final Method[] methods;
        public final Attributes attributes;

    }

    定义异同点

    OpenJDK中的定义和JVM规范中的定义,是等同的。

    区别就是表示方法不一样,前者是Java语言表示方式,后者是类似于C语言的表示方式。

    不足之处

    详细描述,每一个数据结构,估计需要花费太多的篇幅。

    本文浅尝辄止,大家对Java字节码文件的结构有个大概的了解就好。

    下一篇,我们将介绍如何读取.class文件。

    未来计划

    JDK,JVM,Javac,字节码等内容实在是太多了,好多我也还在研究之中。

    最近,写作任务很艰巨,只能一篇篇的写。

    还望大家理解。

    互动交流

    OpenJDK源码研究笔记系列文章,都是我的原创。

    有啥不懂的问题,可以留言。

    有啥觉得不对的地方,欢迎指正。

     

    参考资料:OpenJDK源码,JVM规范第2版(英文原版)

    相关阅读http://blog.csdn.net/fansunion/article/category/1686259

    原文参见http://FansUnion.cn/articles/2967

  • 相关阅读:
    给西安市网民的一封信
    西客集推出西安我家的功能了
    西客集又增加新功能了
    为者常成,行者常至
    kvm虚拟机磁盘&文件系统扩容流程
    Git常用命令大全
    Linux下Nexus的部署教程
    sonatype nexus简介(转)
    curl时加参数o或重定向符号>>将结果输出不到文件里怎么办?
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463505.html
Copyright © 2011-2022 走看看