.java文件通过javac编译器编译后会生成对应的.class文件,对java而言程序的执行都是在jvm中进行的,所以class文件的结构必然要知足jvm的标准;.class是格式严谨的二进制文件,没有任何的空白符和分隔符,必须严格按照JVM标准排列;可使用javap -c命令反编译获得更易阅读的字节码文件html
顾名思义,这三个字段分别存储着class文件的魔数,class文件的副版本号和主版本号
值得一提的是magic字段的值自Oak时代就被肯定为0XCAFEBABE,这也许就是为何java和javaer都和咖啡有着深厚的不解之缘java
cp_info {u1 tag;u1 info[];}
;u1 tag;u2 length;u1 bytes[length];
,用来存储全限定类名、方法名、字段名等,length字段使用了u2存储,所以最大只能为65535Byte;u1 tag;u2 name_index;u2 descriptor_index;
,其中name_index存储的值为一个CONSTANT_Utf8_info常量在常量池中的下标,该CONSTANT_Utf8_info表示了一个field或method的名称,或<init>,descriptor_index存储的值为一个CONSTANT_Utf8_info常量在常量池中的下标,该CONSTANT_Utf8_info表示了一个field或method的描述符信息;u1 tag;u2 class_index;u2 name_and_type_index;
,用来存储类的字段信息,其中class_index存储的值表示一个CONSTANT_Class_info常量在常量池中的下标,该CONSTANT_Class_info存储了此field所在类的类名信息,name_and_type_index存储的值表示一个CONSTANT_NameAndType_info常量在常量池中的下标,该CONSTANT_NameAndType_info表示了此field的name和描述符信息,相似结构的还有CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info;u1 tag; u1 reference_kind; u2 reference_index;
,其中reference_kind目前仅有1-9九个值,分别表明不一样的methodHandle类型,不一样值表明的含义能够参考官方文档,针对不一样值的reference_kind,reference_index将分别指向CONSTANT_Fieldref_info或CONSTANT_Methodref_info或CONSTANT_InterfaceMethodref_info,用来对methodHandle的内容作更为详尽的描述;u1 tag; u2 bootstrap_method_attr_index; u2name_and_type_index;
,bootstrap_method_attr_index表示所使用的引导方法在class文件中的引导方法表中的下标,CONSTANT_NameAndType_info表示一个CONSTANT_NameAndType_info常量在常量池中的下标,该CONSTANT_NameAndType_info存储着会动态生成的field或method的描述信息用来表示类或接口的访问权限,以及内部元素的标志信息,须要注意的是access_flags被定义为掩码,所以虽然使用的是u2类型,但仅有16个标志位可使用,每一个access_flag仅在一个标志位上为1,其余位所有为0,目前定义了九个,分别用来标识public/final/super/interface/abstract/synthetic/annotation/enum/module,具体解释能够参考官方文档bootstrap
《深刻理解Java虚拟机》数组
Oracle JVMS数据结构