This is the source code I have:
public class Koray {
public static void main(String [] args) {
System.out.println("This is a sample program.");
}
}
And when I compile this, I get the bytecode. When I look at the bytecode with a Hexadecimal viewer I see part:
19 54 68 69 73 20 69 73 20 61 20 73 61 6D 70 6C 65 20 70 72 6F 67 72 61 6D 2E
which can be read as
This is a sample program.
if the bytes are interpreted as characters.
And when I do
javap -c Koray.class
do disassemble this class I see:
Compiled from "Koray.java"
public class Koray {
public Koray();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String This is a sample program.
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: bipush 10
10: istore_1
11: return
}
My question is, where is this String seen in the disassembled text? I only see it in a comment.
See that
ldc
instruction? It loads a constant from the runtime constant pool. That's where the your string is stored. To print the constant pool as well, add-verbose
option to javap call.ldc #3
loads the string constant stored in the constant pool, which is a separate table that stores constants such asString
literals and class names.See http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4 from the JVM specification:
You can view the string table using
javap -verbose ClassName
.A sample output would be something like:
This line uses the
opcode
ldc
, which loads a constant onto the operand stack. At this point, we're going to load whatever constant is in index#3
of our constant pool table.The constant pool table is where most of the literal constant values are stored. (ref) The command
javap -c -verbose <classfile>
provides the output for constant pool table.Example output:
More info from VM Spec ( http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html ):