mastering java bytecode - jax.de 2012

159
Mastering Java Bytecode Anton Arhipov | ZeroTurnaround

Upload: anton-arhipov

Post on 26-Jan-2015

122 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Mastering Java Bytecode - JAX.de 2012

Mastering Java Bytecode

Anton Arhipov | ZeroTurnaround

Page 2: Mastering Java Bytecode - JAX.de 2012

whoami

• Anton Arhipov• Java Dev / Product Lead• ZeroTurnaround, JRebel

• @antonarhipov @javarebel

Page 3: Mastering Java Bytecode - JAX.de 2012

Today – Java Core

• Mastering Java Bytecode

• The Future of Java on Multi-Core, Lambdas, Spliterators and Methods

• OpenJDK JVM Internals

• Invokedynamic Deep Dive

Page 4: Mastering Java Bytecode - JAX.de 2012
Page 5: Mastering Java Bytecode - JAX.de 2012

Why Bytecode?

• Know your platform!• Create your own compiler?• Programming model (AOP, ORM)• Awesome tools (JRebel )

• … just bored?

Page 6: Mastering Java Bytecode - JAX.de 2012

THE INTRO

Page 7: Mastering Java Bytecode - JAX.de 2012

1 + 2

Page 8: Mastering Java Bytecode - JAX.de 2012

1 + 2

1 2 +

Page 9: Mastering Java Bytecode - JAX.de 2012

1 + 2

1 2 +

Page 10: Mastering Java Bytecode - JAX.de 2012

1 + 2

1 2 + PUSH 1 1

Page 11: Mastering Java Bytecode - JAX.de 2012

1 + 2

1 2 + PUSH 1PUSH 2

21

Page 12: Mastering Java Bytecode - JAX.de 2012

1 + 2

1 2 + PUSH 1PUSH 2ADD

3

Page 13: Mastering Java Bytecode - JAX.de 2012

1 + 2

1 2 + ICONST_1ICONST_2IADD

3

Page 14: Mastering Java Bytecode - JAX.de 2012

? = 1 + 2

Page 15: Mastering Java Bytecode - JAX.de 2012

TAXONOMY

Page 16: Mastering Java Bytecode - JAX.de 2012

Bytecode

• One-byte instructions• 256 possible opcodes• 200+ in use

Page 17: Mastering Java Bytecode - JAX.de 2012

TYPE OPERATION

Page 18: Mastering Java Bytecode - JAX.de 2012

• <TYPE> ::= b, s, c, i, l, f, d, a

OPERATIONTYPE

Page 19: Mastering Java Bytecode - JAX.de 2012

• <TYPE> ::= b, s, c, i, l, f, d, a• constant values (ldc, iconst_1)

OPERATIONTYPE

Page 20: Mastering Java Bytecode - JAX.de 2012

• <TYPE> ::= b, s, c, i, l, f, d, a• constant values (ldc, iconst_1)• Local variables and stack interaction (load/store)• Array operations (aload, astore)• Math (add, sub, mul, div)• Boolean/bitwise operations (iand, ixor)• Comparisons (cmpg, cmpl, ifne, ifeq)• Conversions (l2d, i2l)

OPERATIONTYPE

Page 21: Mastering Java Bytecode - JAX.de 2012

Bytecode Taxonomy

Page 22: Mastering Java Bytecode - JAX.de 2012

Bytecode Taxonomy

Stack Manipulation

Page 23: Mastering Java Bytecode - JAX.de 2012

Bytecode Taxonomy

Stack Manipulation

FlowControl

Page 24: Mastering Java Bytecode - JAX.de 2012

Bytecode Taxonomy

Stack Manipulation

FlowControl

Object Model

Page 25: Mastering Java Bytecode - JAX.de 2012

Bytecode Taxonomy

Stack Manipulation

FlowControl

ArithmeticsObject Model

Page 26: Mastering Java Bytecode - JAX.de 2012

Bytecode Taxonomy

Stack Manipulation

FlowControl

ArithmeticsObject Model

monitorentermonitorexit

Page 27: Mastering Java Bytecode - JAX.de 2012

TOOLING

Page 28: Mastering Java Bytecode - JAX.de 2012

javap

• Java class file disassembler• Used with no options shows class structure

only– Methods, superclass, interfaces, etc

• -c shows the bytecode• -private shows all methods and members• -s prints internal signatures• -l prints line numbers and local variable

tables

Page 29: Mastering Java Bytecode - JAX.de 2012

HELLO WORLD!

Page 30: Mastering Java Bytecode - JAX.de 2012
Page 31: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -c

Page 32: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 33: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

the default constructor

Page 34: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

push this to stack

Page 35: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 36: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 37: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 38: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

get static field

Page 39: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 40: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 41: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

Page 42: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -cCompiled 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

What’s #1,#2, etc ?

Page 43: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -c -verbose

Page 44: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -c -verbose

Page 45: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -c -verboseCompiled 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>":()Vconst #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;)Vconst #5 = class #26; // Helloconst #6 = class #27; // java/lang/Objectconst #7 = Asciz <init>;const #8 = Asciz ()V;

Page 46: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -c -verboseCompiled 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>":()Vconst #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;)Vconst #5 = class #26; // Helloconst #6 = class #27; // java/lang/Objectconst #7 = Asciz <init>;const #8 = Asciz ()V;

Page 47: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>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;

Page 48: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>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;

Page 49: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>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;

Page 50: Mastering Java Bytecode - JAX.de 2012

C:\work\geecon\classes>javap Hello -c -verbose…public static void main(java.lang.String[]); Code: Stack=2, Locals=1, Args_size=1 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 8: return LineNumberTable: line 4: 0 line 5: 8 LocalVariableTable: Start Length Slot Name Signature 0 9 0 args [Ljava/lang/String;

Page 51: Mastering Java Bytecode - JAX.de 2012

MODEL OF COMPUTATION

Page 52: Mastering Java Bytecode - JAX.de 2012

Stack Machine

Page 53: Mastering Java Bytecode - JAX.de 2012

Stack Machine

• JVM is a stack-based machine

Page 54: Mastering Java Bytecode - JAX.de 2012

Stack Machine

• JVM is a stack-based machine• Each thread has a stack

Page 55: Mastering Java Bytecode - JAX.de 2012

Stack Machine

• JVM is a stack-based machine• Each thread has a stack• Stack stores frames

Page 56: Mastering Java Bytecode - JAX.de 2012

Stack Machine

• JVM is a stack-based machine• Each thread has a stack• Stack stores frames• Frame is created on method invocation

Page 57: Mastering Java Bytecode - JAX.de 2012

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

Page 58: Mastering Java Bytecode - JAX.de 2012

The Frame

Operand stack

Local variables

20 1 N…

Constant Pool

#1

Page 59: Mastering Java Bytecode - JAX.de 2012

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 60: Mastering Java Bytecode - JAX.de 2012

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

aload_0 getfield 00 02 areturn

0 1 2 3 4

Page 61: Mastering Java Bytecode - JAX.de 2012

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

2A B4 00 02 B0

0 1 2 3 4

Page 62: Mastering Java Bytecode - JAX.de 2012

public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 63: Mastering Java Bytecode - JAX.de 2012

STACK CRUNCHING

Page 64: Mastering Java Bytecode - JAX.de 2012

AB

duppopswapdup_x1dup2_x1

Page 65: Mastering Java Bytecode - JAX.de 2012

A

B

duppopswapdup_x1dup2_x1

A

Page 66: Mastering Java Bytecode - JAX.de 2012

duppopswapdup_x1dup2_x1

AB

Page 67: Mastering Java Bytecode - JAX.de 2012

duppopswapdup_x1dup2_x1

AB

Page 68: Mastering Java Bytecode - JAX.de 2012

duppopswapdup_x1dup2_x1

AB

B

Page 69: Mastering Java Bytecode - JAX.de 2012

duppopswapdup_x1dup2_x1

AB

BBA

Page 70: Mastering Java Bytecode - JAX.de 2012

dup2_x2

How do you swap doubles?

Page 71: Mastering Java Bytecode - JAX.de 2012

dup2_x2

Page 72: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0

0.0

Page 73: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1 1.0

0.0

Page 74: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1swap

1.0

0.0

Page 75: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1swap

1.0

0.0

not allowed!

Page 76: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1swap2

1.0

0.0

Page 77: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1swap2

1.0

0.0

doesn’texist

Page 78: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1dup2_x2

1.0

0.0

1.0

Page 79: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1dup2_x2pop2

0.0

1.0

Page 80: Mastering Java Bytecode - JAX.de 2012

dup2_x2dconst_0dconst_1dup2_x2pop2

0.0

1.0

profit!

Page 81: Mastering Java Bytecode - JAX.de 2012

LOCAL VARIABLES

Page 82: Mastering Java Bytecode - JAX.de 2012

Local Variables

Page 83: Mastering Java Bytecode - JAX.de 2012

Local Variables

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

Page 84: Mastering Java Bytecode - JAX.de 2012

Local Variables

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

numbered

from 0

Page 85: Mastering Java Bytecode - JAX.de 2012

Local Variables

instance methodshave this at 0

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

Page 86: Mastering Java Bytecode - JAX.de 2012

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

Local Variables

The table maps

numbers to names

Page 87: Mastering Java Bytecode - JAX.de 2012

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

Sized explicitly

Local Variables

Page 88: Mastering Java Bytecode - JAX.de 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var value

Local Variables

0

1

2

3

4

0

1

2

3

4

Page 89: Mastering Java Bytecode - JAX.de 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

Page 90: Mastering Java Bytecode - JAX.de 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth valuevar value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

Stack

Page 91: Mastering Java Bytecode - JAX.de 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

1

Page 92: Mastering Java Bytecode - JAX.de 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

1

Page 93: Mastering Java Bytecode - JAX.de 2012

ldc "Hello"astore_0iconst_1astore_1aload_0

depth value

Stack

var value

Local Variables

"Hello"0

1

2

3

4

0

1

2

3

4

1

"Hello"

Page 94: Mastering Java Bytecode - JAX.de 2012

StackLocal

Variables Table

store

load

Page 95: Mastering Java Bytecode - JAX.de 2012

OBJECTS

Page 96: Mastering Java Bytecode - JAX.de 2012

new <init> <clinit>

Instance initialization method

Class and interface initialization method

Object Initialization

0xBB

Page 97: Mastering Java Bytecode - JAX.de 2012

Object Initialization: static {}

static {}; Code: 0: iconst_1 1: putstatic #2; //Field a:I 4: iconst_2 5: putstatic #3; //Field b:I 8: return

Page 98: Mastering Java Bytecode - JAX.de 2012

Object Initialization: static {}

static {}; Code: 0: iconst_1 1: putstatic #2; //Field a:I 4: iconst_2 5: putstatic #3; //Field b:I 8: return

<clinit>

Page 99: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

Page 100: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

Page 101: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

public Initializer(); Code:

Page 102: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

public Initializer(); Code: 0: aload_0

Page 103: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

public Initializer(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V

Page 104: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

public Initializer(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: aload_0

Page 105: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

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

Page 106: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

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;

Page 107: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

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

Page 108: Mastering Java Bytecode - JAX.de 2012

Object Initialization: new

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

Page 109: Mastering Java Bytecode - JAX.de 2012

Object Initialization: {}

Page 110: Mastering Java Bytecode - JAX.de 2012

Object Initialization: {}

?

Page 111: Mastering Java Bytecode - JAX.de 2012

Object Initialization: {}

public Initializer(int); Code: 0: aload_0 1: invokespecial #1; // ..<init> 4: aload_0 5: iconst_1 6: putfield #2; //Field a:I 9: aload_0 10: iconst_2 11: putfield #3; //Field c:I 14: aload_0 15: iload_1 16: putfield #4; //Field b:I 19: return

Page 112: Mastering Java Bytecode - JAX.de 2012
Page 113: Mastering Java Bytecode - JAX.de 2012

There’s no initializer

Page 114: Mastering Java Bytecode - JAX.de 2012

METHOD INVOCATION

Page 115: Mastering Java Bytecode - JAX.de 2012

invokeXXX

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

Page 116: Mastering Java Bytecode - JAX.de 2012

invokestatic

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

Integer.valueOf(“42”)

Page 117: Mastering Java Bytecode - JAX.de 2012

invokespecial

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

<init>

private void foo();

super.method();

Page 118: Mastering Java Bytecode - JAX.de 2012

invokevirtual

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

class AA/method1A/method2

Page 119: Mastering Java Bytecode - JAX.de 2012

invokevirtual

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

class A

class B

A/method1A/method2

Page 120: Mastering Java Bytecode - JAX.de 2012

invokevirtual

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

class A

class B

A/method1A/method2

A/method1B/method2B/method3

Page 121: Mastering Java Bytecode - JAX.de 2012

invokeinterface

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

class A

class B impl X

A/method1A/method2

A/method1B/method2B/method3X/methodX

Page 122: Mastering Java Bytecode - JAX.de 2012

invokeinterface

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

class A

class B impl X

A/method1A/method2

A/method1B/method2B/method3X/methodX

D impl XD/method1X/methodX

Page 123: Mastering Java Bytecode - JAX.de 2012

invokeinterface

• invokestatic• invokespecial• invokevirtual• invokeinterface• invokedynamic

class A

class B impl X

A/method1A/method2

A/method1B/method2B/method3X/methodX

D impl XD/method1X/methodX

Page 124: Mastering Java Bytecode - JAX.de 2012

invokeinterface

• 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

class A

class B impl X

A/method1A/method2

A/method1B/method2B/method3X/methodX

D impl XD/method1X/methodX

Page 125: Mastering Java Bytecode - JAX.de 2012

Method Invocation

Page 126: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

Page 127: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

Page 128: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

Page 129: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj

Page 130: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj

param1

Page 131: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj

param1

param2

Page 132: Mastering Java Bytecode - JAX.de 2012

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj?

Page 133: Mastering Java Bytecode - JAX.de 2012

Method Invocation

this.add(1, 2);

0: aload_01: iconst_12: iconst_23: invokevirtual #2; //Method add:(II)I

Page 134: Mastering Java Bytecode - JAX.de 2012

INNER CLASSES

Page 135: Mastering Java Bytecode - JAX.de 2012

Inner Classes

Page 136: Mastering Java Bytecode - JAX.de 2012

Inner Classes

Page 137: Mastering Java Bytecode - JAX.de 2012

Inner Classes

class Car$Engine extends j.l.Object{final Car this$0;

Car$Engine(Car); public void start(); Code: 0: aload_0 1: getfield #1; //Field this$0:LCar; 4: invokestatic #3; // Car.access$000:(LCar;)V 7: return

}

Page 138: Mastering Java Bytecode - JAX.de 2012

Inner Classespublic class Car extends j.l.Object{public Car();private void move();

static void access$000(Car); Code: 0: aload_0 1: invokespecial #1; // move: ()V; 4: return}

class Car$Engine extends j.l.Object{final Car this$0;

Car$Engine(Car); public void start(); Code: 0: aload_0 1: getfield #1; //Field this$0:LCar; 4: invokestatic #3; // Car.access$000:(LCar;)V 7: return

}

Page 139: Mastering Java Bytecode - JAX.de 2012

Inner Classespublic class Car extends j.l.Object{public Car();private void move();

static void access$000(Car); Code: 0: aload_0 1: invokespecial #1; // move: ()V; 4: return}

class Car$Engine extends j.l.Object{final Car this$0;

Car$Engine(Car); public void start(); Code: 0: aload_0 1: getfield #1; //Field this$0:LCar; 4: invokestatic #3; // Car.access$000:(LCar;)V 7: return

}

Page 140: Mastering Java Bytecode - JAX.de 2012

“HOW DO THEY DO THAT?”

Page 141: Mastering Java Bytecode - JAX.de 2012

object Singleton { def test={}}

Page 142: Mastering Java Bytecode - JAX.de 2012

object Singleton { def test={}}

$> scalac Singleton.scala

Singleton.class Singleton$.class

Page 143: Mastering Java Bytecode - JAX.de 2012

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}

Page 144: Mastering Java Bytecode - JAX.de 2012

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}

Page 145: Mastering Java Bytecode - JAX.de 2012

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}

Page 146: Mastering Java Bytecode - JAX.de 2012

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$();}

Page 147: Mastering Java Bytecode - JAX.de 2012

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$();}

Page 148: Mastering Java Bytecode - JAX.de 2012

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$();}

Page 149: Mastering Java Bytecode - JAX.de 2012

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

Page 150: Mastering Java Bytecode - JAX.de 2012

object Singleton { def test={}}

Page 151: Mastering Java Bytecode - JAX.de 2012

object Singleton { def test={}}

public class Singleton { public void test(){ Singleton$.MODULE$.test(); }}

Page 152: Mastering Java Bytecode - JAX.de 2012

object Singleton { def test={}}

public class Singleton { public void test(){ Singleton$.MODULE$.test(); }} public final class Singleton$ implements scala.ScalaObject { public static final Singleton$ MODULE$; static { new Singleton$(); }

private Singleton$(){ MODULE$ = this; }

public void test() { }}

Page 153: Mastering Java Bytecode - JAX.de 2012

class Groovy { }

Page 154: Mastering Java Bytecode - JAX.de 2012

class Groovy { }

$> groovyc Groovy.groovy$> javap –c –p Groovy

Page 155: Mastering Java Bytecode - JAX.de 2012

class Groovy { }

$> groovyc Groovy.groovy$> javap –c –p Groovypublic class Test extends java.lang.Object implements groovy.lang.GroovyObject{ private static org.codehaus.groovy.reflection.ClassInfo $staticClassInfo; private transient groovy.lang.MetaClass metaClass; public static java.lang.Long __timeStamp; public static java.lang.Long __timeStamp__239_neverHappen1304807931117; private static java.lang.ref.SoftReference $callSiteArray; private static java.lang.Class $class$groovy$lang$MetaClass; private static java.lang.Class $class$Test; private static java.lang.Class $class$java$lang$String; public java.lang.Object this$dist$invoke$2(java.lang.String, java.lang.Object); public void this$dist$set$2(java.lang.String, java.lang.Object); public java.lang.Object this$dist$get$2(java.lang.String); protected groovy.lang.MetaClass $getStaticMetaClass(); public groovy.lang.MetaClass getMetaClass(); public void setMetaClass(groovy.lang.MetaClass); public java.lang.Object invokeMethod(java.lang.String, java.lang.Object); public java.lang.Object getProperty(java.lang.String); public void setProperty(java.lang.String, java.lang.Object);

Page 156: Mastering Java Bytecode - JAX.de 2012

OBJECTWEB ASM

Page 157: Mastering Java Bytecode - JAX.de 2012

SLIDESGOTO IDESLIDESIDE: DEMO

Page 158: Mastering Java Bytecode - JAX.de 2012

https://github.com/antonarhipov

Page 159: Mastering Java Bytecode - JAX.de 2012

@antonarhipov

[email protected]