31. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
}
32. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
}
33. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
34. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code: the default constructor
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
35. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code: push this to stack
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
36. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
invoke <init> on this
37. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
38. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
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 Hello, World!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
39. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
get static field
public static void main(java.lang.String[]);
Code:
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
40. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
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 Hello, World!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
load string to the stack
41. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
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 Hello, World!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
invoke method with parameter
42. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
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 Hello, World!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
43. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c
What’s #1,#2, etc ?
} Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
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 Hello, World!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
44. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
}
45. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
}
46. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
} Compiled from "Hello.java“
public class Hello extends java.lang.Object
SourceFile: "Hello.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#20; // java/lang/Object."<init>":()V
const #2 = Field #21.#22; // java/lang/System.out:Ljava/io/PrintStream;
const #3 = String #23; // Hello, World!
const #4 = Method #24.#25; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class #26; // Hello
const #6 = class #27; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
47. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
} Compiled from "Hello.java“
public class Hello extends java.lang.Object
SourceFile: "Hello.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#20; // java/lang/Object."<init>":()V
const #2 = Field #21.#22; // java/lang/System.out:Ljava/io/PrintStream;
const #3 = String #23; // Hello, World!
const #4 = Method #24.#25; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class #26; // Hello
const #6 = class #27; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
48. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
} …
public Hello();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LHello;
49. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
} …
public Hello();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LHello;
50. public class Hello {
public static void main(String[] args) {
System.out.println ( “Hello, World!” );
}
C:workgeeconclasses>javap Hello -c -verbose
} …
public Hello();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LHello;
54. Stack Machine
JVM is a stack-based machine
Each thread has a stack
55. Stack Machine
JVM is a stack-based machine
Each thread has a stack
Stack stores frames
56. Stack Machine
JVM is a stack-based machine
Each thread has a stack
Stack stores frames
Frame is created on method
invocation
57. Stack Machine
JVM is a stack-based machine
Each thread has a stack
Stack stores frames
Frame is created on method
invocation
Frame consists of:
Operand stack
Array of local variables
84. Local Variables
public int calculate(int value) {
return value + 42;
}
public int calculate(int);
Code:
Stack=2, Locals=2, Args_size=2
…
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LLocalVariables;
0 5 1 value I
85. Local Variables
public int calculate(int value) {
return value + 42;
}
public int calculate(int);
Code:
Stack=2, Locals=2, Args_size=2
…
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LLocalVariables;
0 5 1 value I
86. Local Variables
public int calculate(int value) {
return value + 42;
}
public int calculate(int);
Code:
Stack=2, Locals=2, Args_size=2
…
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LLocalVariables;
0 5 1 value I
87. Local Variables
public int calculate(int value) {
return value + 42;
}
The table
public int calculate(int);
Code:
maps
Stack=2, Locals=2, Args_size=2 numbers to
…
names
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LLocalVariables;
0 5 1 value I
88. Local Variables
public int calculate(int value) {
return value + 42;
}
public int calculate(int);
Code:
Stack=2, Locals=2, Args_size=2 Sized explicitly
…
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LLocalVariables;
0 5 1 value I
89. Local Variables Stack
var value depth value
ldc "Hello"
0 0
astore_0
1 iconst_1 1
astore_1
2 aload_0 2
3 3
4 4
90. Local Variables Stack
var value depth value
ldc "Hello"
0 0 "Hello"
astore_0
1 iconst_1 1
astore_1
2 aload_0 2
3 3
4 4
91. Local Variables Stack
var value depth value
ldc "Hello"
0 "Hello" 0
astore_0
1 iconst_1 1
astore_1
2 aload_0 2
3 3
4 4
92. Local Variables Stack
var value depth value
ldc "Hello"
0 "Hello" 0 1
astore_0
1 iconst_1 1
astore_1
2 aload_0 2
3 3
4 4
93. Local Variables Stack
var value depth value
ldc "Hello"
0 "Hello" 0
astore_0
1 1 iconst_1 1
astore_1
2 aload_0 2
3 3
4 4
94. Local Variables Stack
var value depth value
ldc "Hello"
0 "Hello" 0 "Hello"
astore_0
1 1 iconst_1 1
astore_1
2 aload_0 2
3 3
4 4
98. Object Initialization: static {}
public class Initializer {
static int a;
static int b;
static { a = 1; }
static { b = 2; } static {};
Code:
} 0: iconst_1
1: putstatic #2; //Field a:I
4: iconst_2
5: putstatic #3; //Field b:I
8: return
99. Object Initialization: static {}
public class Initializer {
static int a;
static int b;
<clinit>
static { a = 1; }
static { b = 2; } static {};
Code:
} 0: iconst_1
1: putstatic #2; //Field a:I
4: iconst_2
5: putstatic #3; //Field b:I
8: return
100. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
}
}
101. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
}
102. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
103. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
1: invokespecial #1; //Method java/lang/Object."<init>":()V
104. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
105. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: new #2; //class java/lang/Object
8: dup
106. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: new #2; //class java/lang/Object
8: dup
9: invokespecial #1; //Method java/lang/Object."<init>":()V
12: putfield #3; //Field o:Ljava/lang/Object;
107. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: new #2; //class java/lang/Object
8: dup
9: invokespecial #1; //Method java/lang/Object."<init>":()V
12: putfield #3; //Field o:Ljava/lang/Object;
15: return
108. Object Initialization: new
public class Initializer {
Object o;
public Initializer() {
o = new Object();
public Initializer(); }
Code:
0: aload_0 }
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: new #2; //class java/lang/Object
8: dup
9: invokespecial #1; //Method java/lang/Object."<init>":()V
12: putfield #3; //Field o:Ljava/lang/Object;
15: return
109. Object Initialization: {}
public class Initializer {
int a;
int b;
int c;
{ a = 1; }
public Initializer(int b) {
this.b = b;
}
{ c = 2; }
}
110. Object Initialization: {}
public class Initializer {
int a;
int b;
int c;
{ a = 1; }
public Initializer(int b) {
this.b = b;
}
{ c = 2; }
}
111. Object Initialization: {}
public class Initializer {
int a;
int b;
int c;
{ a = 1; }
public Initializer(int b) {
this.b = b;
}
{ c = 2; }
}
112. Object Initialization: {}
public class Initializer {
int a;
int b;
int c;
{ a = 1; }
public Initializer(int b) {
this.b = b;
}
{ c = 2; }
}
113. Object Initialization: {}
public class Initializer {
int a; public Initializer(int);
int b; Code:
int c; 0: aload_0
1: invokespecial #1; // ..<init>
4: aload_0
{ a = 1; } 5: iconst_1
6: putfield #2; //Field a:I
public Initializer(int b) { 9: aload_0
this.b = b; 10: iconst_2
} 11: putfield #3; //Field c:I
14: aload_0
{ c = 2; } 15: iload_1
} 16: putfield #4; //Field b:I
19: return
122. Java Method Invocation
invokestatic class A
invokespecial A/method1
A/method2
invokevirtual
invokeinterface
invokedynamic
123. Java Method Invocation
invokestatic class A
invokespecial A/method1
A/method2
invokevirtual
invokeinterface class B
invokedynamic
124. Java Method Invocation
invokestatic class A
invokespecial A/method1
A/method2
invokevirtual
invokeinterface class B
A/method1
invokedynamic B/method2
B/method3
125. Java Method Invocation
invokestatic class A
invokespecial A/method1
A/method2
invokevirtual
invokeinterface class B impl X
A/method1
invokedynamic B/method2
B/method3
X/methodX
126. Java Method Invocation
invokestatic class A
invokespecial A/method1
A/method2
invokevirtual
invokeinterface class B impl X
A/method1
invokedynamic B/method2
B/method3
X/methodX
class D impl X
D/method1
X/methodX
127. Java Method Invocation
invokestatic class A
invokespecial A/method1
A/method2
invokevirtual
invokeinterface class B impl X
A/method1
invokedynamic B/method2
B/method3
X/methodX
class D impl X
D/method1
X/methodX
128. Java Method Invocation
invokestatic
invokespecial
invokevirtual
invokeinterface
invokedynamic
Efficient Implementation of Java Interfaces:
Invokeinterface Considered Harmless, Bowen
Alpern, Anthony Cocchi, Stephen Fink, David
Grove, and Derek Lieber, OOPSLA’01
143. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
144. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
145. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
146. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
public final class Singleton$ extends java.lang.Object implements
scala.ScalaObject {
public static final Singleton$ MODULE$;
public static {};
Code:
0: new #9; //class Singleton$
3: invokespecial #12; //Method "<init>":()V
6: return
public void test();
private Singleton$();
}
147. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
public final class Singleton$ extends java.lang.Object implements
scala.ScalaObject {
public static final Singleton$ MODULE$;
public static {};
Code:
0: new #9; //class Singleton$
3: invokespecial #12; //Method "<init>":()V
6: return
public void test();
private Singleton$();
}
148. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
public final class Singleton$ extends java.lang.Object implements
scala.ScalaObject {
public static final Singleton$ MODULE$;
public static {};
Code:
0: new #9; //class Singleton$
3: invokespecial #12; //Method "<init>":()V
6: return
public void test();
private Singleton$();
}
149. public final class Singleton extends java.lang.Object {
public static final void test();
Code:
0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$;
3: invokevirtual #13; //Method Singleton$.test:()V
6: return
}
public final class Singleton$ extends java.lang.Object implements
scala.ScalaObject {
public static final Singleton$ MODULE$;
public static {};
public void test();
private Singleton$();
Code:
0: aload_0
1: invokespecial #17; //Method java/lang/Object."<init>":()V
4: aload_0
5: putstatic #19; //Field MODULE$:LSingleton$;
8: return
151. public class Singleton {
public void test(){
Singleton$.MODULE$.test();
}
}
object Singleton {
def test={}
}
152. public class Singleton {
public void test(){
Singleton$.MODULE$.test();
}
}
public final class Singleton$
object Singleton { implements scala.ScalaObject {
def test={} public static final Singleton$ MODULE$;
} static { new Singleton$(); }
private Singleton$(){
MODULE$ = this;
}
public void test() {
}
}
154. Javassist
Bytecode manipulation made easy
Source-level and bytecode-level API
Uses the vocabulary of Java language
On-the-fly compilation of the injected code
http://www.jboss.org/javassist
155. for(int i = 0; i < 100; i++){
int a = 0;
try {
while (true) {
a++;
foo(a);
if(a > 1) break;
}
} catch (Exception e) {
}
}
156. Javassist
CtMethod method = …
method.setBody(“ for(int i = 0; i < 100; i++){
int a = 0;
try {
while (true) {
a++;
foo(a);
if(a > 1) break;
}
} catch (Exception e) {
}
}”);
157. -Xverify:all
Exception in thread "main" java.lang.VerifyError:
(class: zt/javassist/My, method: test signature:
()V) Inconsistent stack height 0 != 1