Constant pool is a part of .class
file (and its in-memory representation) that contains constants needed to run the code of that class.
These constants include literals specified by the programmer and symbolic references generated by compiler. Symbolic references are basically names of classes, methods and fields referenced from the code. These references are used by the JVM to link your code to other classes it depends on.
For example, the following code
System.out.println("Hello, world!");
produces the following bytecode (javap
output)
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello, world!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
#n
here are references to the constant pool. #2
is a symbolic reference to System.out
field, #3
is a Hello, world!
string and #4
is a symbolic reference to PrintStream.println(String)
method.
As you can see, symbolic references are not just names - for example, symbolic reference to the method also contains information about its parameters (Ljava/lang/String;
) and return type (V
means void
).
You can inspect constant pool of a class by running javap -verbose
for that class.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…