Contents Prev Next Up

## Class File Format

# Constant Pool

Strings
tag
length
bytes
Classes and Interfaces
tag
name_index
Fields and Methods
tag
class_index
name_and_type_index
Abstract Fields and Methods
tag
name_index
signature_index
String Objects
tag
name_index
Numeric Constants
Four-Byte Constants
tag
bytes
Eight-Byte Constants
tag
high_bytes, low_bytes

Each item in the constant pool begins with a 1-byte tag:. The table below lists the valid tags and their values.

Each tag byte is then followed by one or more bytes giving more information about the specific constant.

### Strings

CONSTANT_Asciz and CONSTANT_Unicode are used to represent constant string values.

    CONSTANT_Asciz_info {
    	u1	tag;
    	u2	length;
    	u1	bytes[length];
    }

    CONSTANT_Unicode_info {
    	u1	tag;
    	u2	length;
    	u2	bytes[length];
    }

### tag

The tag will have the value CONSTANT_Asciz or CONSTANT_Unicode.

### length

The number of bytes in the string. This length does not include the implicit null termination.

### bytes

The actual bytes in the string. The null termination is not included.

### Classes and Interfaces

CONSTANT_Class is used to represent a class or an interface.

    CONSTANT_Class_info {
    	u1	tag;
    	u2	name_index;
    }

### tag

The tag will have the value CONSTANT_Class

### name_index

constant_pool[name_index] is a string giving the name of the class.

Because arrays are objects, the opcodes anewarray and multianewarray can reference array "classes" via CONSTANT_Class items in the constant pool. In this case, the name of the class is its signature. For example, the class name for

    int[][]

is

    [[I

The class name for

    Thread[]

is

    "[Ljava.lang.Thread;"

### Fields and Methods

Fields, methods, and interface methods are represented by similar structures.

    CONSTANT_Fieldref_info {
    	u1	tag;
    	u2	class_index;
    	u2	name_and_type_index;
    }

    CONSTANT_Methodref_info {
    	u1	tag;
    	u2	class_index;
    	u2	name_and_type_index;
    }

    CONSTANT_InterfaceMethodref_info {
    	u1	tag;
    	u2	class_index;
    	u2	name_and_type_index;
    }

### tag

The tag will have the value CONSTANT_Fieldref, CONSTANT_Methodref, or CONSTANT_InterfaceMethodref.

### class_index

constant_pool[class_index] will be an entry of type CONSTANT_Class giving the name of the class or interface containing the field or method.

For CONSTANT_Fieldref and CONSTANT_Methodref, the CONSTANT_Class item must be an actual class. For CONSTANT_InterfaceMethodref, the item must be an interface which purports to implement the given method.

### name_and_type_index

constant_pool[name_and_type_index] will be an entry of type CONSTANT_NameAndType. This constant pool entry gives the name and signature of the field or method.

### Abstract Fields and Methods

CONSTANT_NameAndType is used to represent a field or method, detached from any particular class or implementation.

    CONSTANT_NameAndType_info {
    	u1	tag;
    	u2	name_index;
    	u2	signature_index;
    }

### tag

The tag will have the value CONSTANT_NameAndType

### name_index

constant_pool[name_index] is a string giving the name of the field or method.

### signature_index

constant_pool[signature_index] is a string giving the signature of the field or method.

### String Objects

CONSTANT_String is used to represent constant objects of the built-in type String.

    CONSTANT_String_info {
    	u1	tag;
    	u2	string_index;
    }

### tag

The tag will have the value CONSTANT_String

### name_index

constant_pool[string_index] is a string giving the value to which the String object is initialized.

The string at constant_pool[string_index] is "encoded" so that strings containing only ASCIZ characters, can be represented using only one byte per character, but characters of up to 16 bits can be represented. The format we use is a modified UTF*1 format.

All characters in the range 0x0001 to 0x007F are represented by a single byte:

         +-+-+-+-+-+-+-+-+
         |0|7bits of data|
         +-+-+-+-+-+-+-+-+

The null character (0x0000) and characters in the range 0x0080 to 0x03FF are represented by a pair of two bytes:

         +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+
         |1|1|0| 5 bits |   |1|0|  6 bits   |
         +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+

Characters in the range 0x0400 to 0xFFFF are represented by three bytes:

         +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+
         |1|1|1|0|4 bits |   |1|0|  6 bits   |   |1|0|  6 bits   |
         +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+

### Numeric Constants

#### Four-Byte Constants

CONSTANT_Integer and CONSTANT_Float represent four-byte constants.

    CONSTANT_Integer_info {
    	u1	tag;
    	u4	bytes;
    }

    CONSTANT_Float_info {
    	u1	tag;
    	u4	bytes;
    }

### tag

The tag will have the value CONSTANT_Integer or CONSTANT_Float

### bytes

For integers, the four bytes are in the integer. For floats, the four bytes represent the standard IEEE representation of the floating point number.

#### Eight-Byte Constants

CONSTANT_Long and CONSTANT_Double represent eight-byte constants.

    CONSTANT_Long_info {
    	u1	tag;
    	u4	high_bytes;
    	u4	low_bytes;
    }

    CONSTANT_Double_info {
    	u1	tag;
    	u4	high_bytes;
    	u4	low_bytes;
    }

All eight-byte constants take up two spots in the constant pool. If this is the nth item in the constant pool, then the next item will be numbered n+2.

### tag

The tag will have the value CONSANT_Long or CONSTANT_Double.

### high_bytes, low_bytes

For CONSTANT_Long, the 64-bit value is (high_bytes << 32) + low_bytes.

For CONSTANT_Double, the 64-bit value, high_bytes and low_bytes together represent the standard IEEE representation of the double-precision floating point number.

Contents Prev Next Up

Generated with CERN WebMaker