请参考《深入java虚拟机第二版》和《java虚拟机规范》。
java虚拟机规范链接:http://docs.oracle.com/javase/specs/jvms/se7/html/
关于class文件结构的介绍:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1
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]; }
The items in the ClassFile
structure are as follows:
The magic
item supplies the magic number identifying the class
file format; it has the value 0xCAFEBABE
.
The values of the minor_version
and major_version
items are the minor and major version numbers of this class
file. Together, a major and a minor version number determine the version of the class
file format. If a class
file has major version number M and minor version number m, we denote the version of its class
file format as M.m. Thus, class
file format versions may be ordered lexicographically, for example, 1.5 < 2.0 < 2.1.
A Java Virtual Machine implementation can support a class
file format of version v if and only if v lies in some contiguous range Mi.0 ≤ v ≤ Mj.m. The release level of the Java SE platform to which a Java Virtual Machine implementation conforms is responsible for determining the range.
Oracle's Java Virtual Machine implementation in JDK release 1.0.2 supports class
file format versions 45.0 through 45.3 inclusive. JDK releases 1.1.* support class
file format versions in the range 45.0 through 45.65535 inclusive. For k ≥ 2, JDK release 1.k supports class
file format versions in the range 45.0 through 44+k.0 inclusive.
The value of the constant_pool_count
item is equal to the number of entries in the constant_pool
table plus one. A constant_pool
index is considered valid if it is greater than zero and less than constant_pool_count
, with the exception for constants of type long
and double
noted in §4.4.5.
The constant_pool
is a table of structures (§4.4) representing various string constants, class and interface names, field names, and other constants that are referred to within the ClassFile
structure and its substructures. The format of each constant_pool
table entry is indicated by its first "tag" byte.
The constant_pool
table is indexed from 1 to constant_pool_count
-1.
The value of the access_flags
item is a mask of flags used to denote access permissions to and properties of this class or interface. The interpretation of each flag, when set, is as shown in Table 4.1.
Table 4.1. Class access and property modifiers
Flag Name | Value | Interpretation |
---|---|---|
ACC_PUBLIC |
0x0001 | Declared public ; may be accessed from outside its package. |
ACC_FINAL |
0x0010 | Declared final ; no subclasses allowed. |
ACC_SUPER |
0x0020 | Treat superclass methods specially when invoked by the invokespecial instruction. |
ACC_INTERFACE |
0x0200 | Is an interface, not a class. |
ACC_ABSTRACT |
0x0400 | Declared abstract ; must not be instantiated. |
ACC_SYNTHETIC |
0x1000 | Declared synthetic; not present in the source code. |
ACC_ANNOTATION |
0x2000 | Declared as an annotation type. |
ACC_ENUM |
0x4000 | Declared as an enum type. |
A class may be marked with the ACC_SYNTHETIC
flag to indicate that it was generated by a compiler and does not appear in source code.
The ACC_ENUM
flag indicates that this class or its superclass is declared as an enumerated type.
An interface is distinguished by its ACC_INTERFACE
flag being set. If its ACC_INTERFACE
flag is not set, this class
file defines a class, not an interface.
If the ACC_INTERFACE
flag of this class
file is set, its ACC_ABSTRACT
flag must also be set (JLS §9.1.1.1). Such a class
file must not have its ACC_FINAL
, ACC_SUPER
or ACC_ENUM
flags set.
An annotation type must have its ACC_ANNOTATION
flag set. If the ACC_ANNOTATION
flag is set, the ACC_INTERFACE
flag must be set as well. If the ACC_INTERFACE
flag of this class
file is not set, it may have any of the other flags in Table 4.1 set, except the ACC_ANNOTATION
flag. However, such a class
file cannot have both its ACC_FINAL
and ACC_ABSTRACT
flags set (JLS §8.1.1.2).
The ACC_SUPER
flag indicates which of two alternative semantics is to be expressed by the invokespecial instruction (§invokespecial) if it appears in this class. Compilers to the instruction set of the Java Virtual Machine should set the ACC_SUPER
flag.
The ACC_SUPER
flag exists for backward compatibility with code compiled by older compilers for the Java programming language. In Oracle’s JDK prior to release 1.0.2, the compiler generated ClassFile
access_flags
in which the flag now representing ACC_SUPER
had no assigned meaning, and Oracle's Java Virtual Machine implementation ignored the flag if it was set.
All bits of the access_flags
item not assigned in Table 4.1 are reserved for future use. They should be set to zero in generated class
files and should be ignored by Java Virtual Machine implementations.
The value of the this_class
item must be a valid index into the constant_pool
table. The constant_pool
entry at that index must be a CONSTANT_Class_info
structure (§4.4.1) representing the class or interface defined by this class
file.
For a class, the value of the super_class
item either must be zero or must be a valid index into the constant_pool
table. If the value of the super_class
item is nonzero, theconstant_pool
entry at that index must be a CONSTANT_Class_info
structure (§4.4.1) representing the direct superclass of the class defined by this class
file. Neither the direct superclass nor any of its superclasses may have the ACC_FINAL
flag set in the access_flags
item of its ClassFile
structure.
If the value of the super_class
item is zero, then this class
file must represent the class Object
, the only class or interface without a direct superclass.
For an interface, the value of the super_class
item must always be a valid index into the constant_pool
table. The constant_pool
entry at that index must be aCONSTANT_Class_info
structure representing the class Object
.
The value of the interfaces_count
item gives the number of direct superinterfaces of this class or interface type.
Each value in the interfaces
array must be a valid index into the constant_pool
table. The constant_pool
entry at each value of interfaces[i]
, where 0 ≤ i <interfaces_count
, must be a CONSTANT_Class_info
structure (§4.4.1) representing an interface that is a direct superinterface of this class or interface type, in the left-to-right order given in the source for the type.
The value of the fields_count
item gives the number of field_info
structures in the fields
table. The field_info
structures (§4.5) represent all fields, both class variables and instance variables, declared by this class or interface type.
Each value in the fields
table must be a field_info
(§4.5) structure giving a complete description of a field in this class or interface. The fields
table includes only those fields that are declared by this class or interface. It does not include items representing fields that are inherited from superclasses or superinterfaces.
The value of the methods_count
item gives the number of method_info
structures in the methods
table.
Each value in the methods
table must be a method_info
(§4.6) structure giving a complete description of a method in this class or interface. If neither of the ACC_NATIVE
andACC_ABSTRACT
flags are set in the access_flags
item of a method_info
structure, the Java Virtual Machine instructions implementing the method are also supplied.
The method_info
structures represent all methods declared by this class or interface type, including instance methods, class methods, instance initialization methods (§2.9), and any class or interface initialization method (§2.9). The methods
table does not include items representing methods that are inherited from superclasses or superinterfaces.
The value of the attributes_count
item gives the number of attributes (§4.7) in the attributes
table of this class.
Each value of the attributes
table must be an attribute_info
(§4.7) structure.
The attributes defined by this specification as appearing in the attributes
table of a ClassFile
structure are the InnerClasses
(§4.7.6), EnclosingMethod
(§4.7.7), Synthetic
(§4.7.8), Signature
(§4.7.9), SourceFile
(§4.7.10), SourceDebugExtension
(§4.7.11), Deprecated
(§4.7.15), RuntimeVisibleAnnotations
(§4.7.16), RuntimeInvisibleAnnotations
(§4.7.17), and BootstrapMethods
(§4.7.21) attributes.
If a Java Virtual Machine implementation recognizes class
files whose version number is 49.0 or above, it must recognize and correctly read Signature
(§4.7.9),RuntimeVisibleAnnotations
(§4.7.16), and RuntimeInvisibleAnnotations
(§4.7.17) attributes found in the attributes
table of a ClassFile
structure of a class
file whose version number is 49.0 or above.
If a Java Virtual Machine implementation recognizes class
files whose version number is 51.0 or above, it must recognize and correctly read BootstrapMethods
(§4.7.21) attributes found in the attributes
table of a ClassFile
structure of a class
file whose version number is 51.0 or above.
A Java Virtual Machine implementation is required to silently ignore any or all attributes in the attributes
table of a ClassFile
structure that it does not recognize. Attributes not defined in this specification are not allowed to affect the semantics of the class
file, but only to provide additional descriptive information (§4.7.1).