JVM详解之:java class文件的密码本
简介
一个简单的class
public class JavaClassUsage {
private int age=18;
public void inc(int number){ this.age=this.age+ number; }}public class com.flydean.JavaClassUsage minor version: major version: 58 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref #2.#3 // java/lang/Object."<init>":()V #2 = Class #4 // java/lang/Object #3 = NameAndType #5:#6 // "<init>":()V #4 = Utf8 java/lang/Object #5 = Utf8 <init> #6 = Utf8 ()V #7 = Fieldref #8.#9 // com/flydean/JavaClassUsage.age:I #8 = Class #10 // com/flydean/JavaClassUsage #9 = NameAndType #11:#12 // age:I #10 = Utf8 com/flydean/JavaClassUsage #11 = Utf8 age #12 = Utf8 I #13 = Utf8 Code #14 = Utf8 LineNumberTable #15 = Utf8 LocalVariableTable #16 = Utf8 this #17 = Utf8 Lcom/flydean/JavaClassUsage; #18 = Utf8 inc #19 = Utf8 (I)V #20 = Utf8 number #21 = Utf8 SourceFile #22 = Utf8 JavaClassUsage.java{ public com.flydean.JavaClassUsage(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 : aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: bipush 18 7: putfield #7 // Field age:I 10: return LineNumberTable: line 7: line 9: 4 LocalVariableTable: Start Length Slot Name Signature 11 this Lcom/flydean/JavaClassUsage;
public void inc(int); descriptor: (I)V flags: ACC_PUBLIC Code: stack=3, locals=2, args_size=2 : aload_0 1: aload_0 2: getfield #7 // Field age:I 5: iload_1 6: iadd 7: putfield #7 // Field age:I 10: return LineNumberTable: line 12: line 13: 10 LocalVariableTable: Start Length Slot Name Signature 11 this Lcom/flydean/JavaClassUsage; 11 1 number I}SourceFile: "JavaClassUsage.java"ClassFile的二进制文件
class文件的密码本
ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; 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 attributes[attributes_count];}01
magic
02
version
03
常量池
这里有两点要注意,点,常量池数组的index是从1开始到constant_pool_count-1结束。
第二点,常量池数组的第0位是作为一个保留位,表示“不引用任何常量池项目”,为某些特殊的情况下使用。
CONSTANT_Methodref_info { u1 tag; u2 class_index; u2 name_and_type_index;}CONSTANT_Class_info { u1 tag; u2 name_index;}Constant pool:1 = Methodref #2.#3 // java/lang/Object."<init>":()V2 = Class #4 // java/lang/Object3 = NameAndType #5:#6 // "<init>":()V4 = Utf8 java/lang/Object5 = Utf8 <init>6 = Utf8 ()V7 = Fieldref #8.#9 // com/flydean/JavaClassUsage.age:I8 = Class #10 // com/flydean/JavaClassUsage9 = NameAndType #11:#12 // age:I10 = Utf8 com/flydean/JavaClassUsage11 = Utf8 age12 = Utf8 I13 = Utf8 Code14 = Utf8 LineNumberTable15 = Utf8 LocalVariableTable16 = Utf8 this17 = Utf8 Lcom/flydean/JavaClassUsage;18 = Utf8 inc19 = Utf8 (I)V20 = Utf8 number21 = Utf8 SourceFile22 = Utf8 JavaClassUsage.java04
描述符
05
access_flags
06
this_class和super_class
2 = Class #4 // java/lang/Object8 = Class #10 // com/flydean/JavaClassUsage07
interfaces_count和interfaces[]
08
fields_count和fields[]
field_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count];}09
methods_count和methods[]
method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count];}10
attributes_count和attributes[]
attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length];}总结
相关文章