Overview of Classfile Constant Pool
Take abstract syntax tree for method type signatures and constants
- serialize it as a graph
To see it, use
javap -verbose
Cafebabe does most of these things for you
- can unzip Scala source code to see how
Documentation is in JVM Spec, Class File Format
Example
class Factorial { public int fact(int num){ int num_aux; if (num < 1) num_aux = 1 ; else num_aux = num * (this.fact(num-1)); return num_aux; } } class Calls { public static void main(String[] args) { Factorial f = new Factorial(); System.out.println("Result is: " + f.fact(6)); } }
Result of javap -v:
Compiled from "Calls.java" class Calls extends java.lang.Object SourceFile: "Calls.java" minor version: 0 major version: 50 Constant pool: const #1 = Method #14.#23; // java/lang/Object."<init>":()V const #2 = class #24; // Factorial const #3 = Method #2.#23; // Factorial."<init>":()V const #4 = Field #25.#26; // java/lang/System.out:Ljava/io/PrintStream; const #5 = class #27; // java/lang/StringBuilder const #6 = Method #5.#23; // java/lang/StringBuilder."<init>":()V const #7 = String #28; // Result is: const #8 = Method #5.#29; // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; const #9 = Method #2.#30; // Factorial.fact:(I)I const #10 = Method #5.#31; // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; const #11 = Method #5.#32; // java/lang/StringBuilder.toString:()Ljava/lang/String; const #12 = Method #33.#34; // java/io/PrintStream.println:(Ljava/lang/String;)V const #13 = class #35; // Calls const #14 = class #36; // java/lang/Object const #15 = Asciz <init>; const #16 = Asciz ()V; const #17 = Asciz Code; const #18 = Asciz LineNumberTable; const #19 = Asciz main; const #20 = Asciz ([Ljava/lang/String;)V; const #21 = Asciz SourceFile; const #22 = Asciz Calls.java; const #23 = NameAndType #15:#16;// "<init>":()V const #24 = Asciz Factorial; const #25 = class #37; // java/lang/System const #26 = NameAndType #38:#39;// out:Ljava/io/PrintStream; const #27 = Asciz java/lang/StringBuilder; const #28 = Asciz Result is: ; const #29 = NameAndType #40:#41;// append:(Ljava/lang/String;)Ljava/lang/StringBuilder; const #30 = NameAndType #42:#43;// fact:(I)I const #31 = NameAndType #40:#44;// append:(I)Ljava/lang/StringBuilder; const #32 = NameAndType #45:#46;// toString:()Ljava/lang/String; const #33 = class #47; // java/io/PrintStream const #34 = NameAndType #48:#49;// println:(Ljava/lang/String;)V const #35 = Asciz Calls; const #36 = Asciz java/lang/Object; const #37 = Asciz java/lang/System; const #38 = Asciz out; const #39 = Asciz Ljava/io/PrintStream;; const #40 = Asciz append; const #41 = Asciz (Ljava/lang/String;)Ljava/lang/StringBuilder;; const #42 = Asciz fact; const #43 = Asciz (I)I; const #44 = Asciz (I)Ljava/lang/StringBuilder;; const #45 = Asciz toString; const #46 = Asciz ()Ljava/lang/String;; const #47 = Asciz java/io/PrintStream; const #48 = Asciz println; const #49 = Asciz (Ljava/lang/String;)V; { Calls(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 11: 0 public static void main(java.lang.String[]); Code: Stack=4, Locals=2, Args_size=1 0: new #2; //class Factorial 3: dup 4: invokespecial #3; //Method Factorial."<init>":()V 7: astore_1 8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream; 11: new #5; //class java/lang/StringBuilder 14: dup 15: invokespecial #6; //Method java/lang/StringBuilder."<init>":()V 18: ldc #7; //String Result is: 20: invokevirtual #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 23: aload_1 24: bipush 6 26: invokevirtual #9; //Method Factorial.fact:(I)I 29: invokevirtual #10; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 32: invokevirtual #11; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 35: invokevirtual #12; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 38: return LineNumberTable: line 13: 0 line 14: 8 line 15: 38 }