java bytecode for discriminating developers - javazone 2011

162
Java Bytecode for Discriminating Developers JavaZone’11, Oslo

Upload: anton-arhipov

Post on 10-May-2015

7.177 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Bytecode for

Discriminating Developers

JavaZone’11, Oslo

Page 2: Java Bytecode for Discriminating Developers - JavaZone 2011

whoami

http://arhipov.blogspot.com

@antonarhipov

@javarebel

Anton Arhipov Java dev. / Product Lead

JRebel

Page 3: Java Bytecode for Discriminating Developers - JavaZone 2011

Java… Do you speak it!?

Page 4: Java Bytecode for Discriminating Developers - JavaZone 2011

Java… Do you speak it!?

Page 5: Java Bytecode for Discriminating Developers - JavaZone 2011

The Master Plan

Bytecode 101

Examples

Page 6: Java Bytecode for Discriminating Developers - JavaZone 2011

THE INTRO

Page 7: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

Page 8: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2 1 2

+

Page 9: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

1 2 +

1 2

+

Page 10: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

1 2 +

1 2

+

Page 11: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

1 2 + PUSH 1 1

1 2

+

Page 12: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

1 2 + PUSH 1

PUSH 2 2 1

1 2

+

Page 13: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

1 2 + PUSH 1

PUSH 2

ADD

3

1 2

+

Page 14: Java Bytecode for Discriminating Developers - JavaZone 2011

1 + 2

1 2 + ICONST_1

ICONST_2

IADD

3

1 2

+

Page 15: Java Bytecode for Discriminating Developers - JavaZone 2011

? = 1 + 2

Page 16: Java Bytecode for Discriminating Developers - JavaZone 2011

TAXONOMY

Page 17: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode

One-byte instructions

256 possible opcodes

200+ in use

Page 18: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode

One-byte instructions

256 possible opcodes

200+ in use

Page 19: Java Bytecode for Discriminating Developers - JavaZone 2011

TYPE OPERATION

Page 20: Java Bytecode for Discriminating Developers - JavaZone 2011

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

TYPE OPERATION

Page 21: Java Bytecode for Discriminating Developers - JavaZone 2011

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

Operations with constant values (ldc, iconst_1)

TYPE OPERATION

Page 22: Java Bytecode for Discriminating Developers - JavaZone 2011

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

Operations with 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)

TYPE OPERATION

Page 23: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode Taxonomy

Stack

Manipulation

Page 24: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode Taxonomy

Stack

Manipulation

Flow

Control

Page 25: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode Taxonomy

Stack

Manipulation

Flow

Control

Object

Model

Page 26: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode Taxonomy

Stack

Manipulation

Flow

Control

Arithmetics Object

Model

Page 27: Java Bytecode for Discriminating Developers - JavaZone 2011

Arithmetics

Bytecode Taxonomy

Stack

Manipulation

Flow

Control

Object

Model

monitorenter

monitorexit

Page 28: Java Bytecode for Discriminating Developers - JavaZone 2011

TOOLING

Page 29: Java Bytecode for Discriminating Developers - JavaZone 2011

javap -c -verbose Clazz

Page 30: Java Bytecode for Discriminating Developers - JavaZone 2011

HELLO, WORLD!

Page 31: Java Bytecode for Discriminating Developers - JavaZone 2011

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 32: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 33: Java Bytecode for Discriminating Developers - JavaZone 2011

C:\work\geecon\classes>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 class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 34: Java Bytecode for Discriminating Developers - JavaZone 2011

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

the default constructor

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 35: Java Bytecode for Discriminating Developers - JavaZone 2011

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

push this to stack

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 36: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 37: Java Bytecode for Discriminating Developers - JavaZone 2011

C:\work\geecon\classes>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 class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 38: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 39: Java Bytecode for Discriminating Developers - JavaZone 2011

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

get static field

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 40: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 41: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 42: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 43: Java Bytecode for Discriminating Developers - JavaZone 2011

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

What’s #1,#2, etc ?

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 44: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 45: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 46: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 47: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 48: Java Bytecode for Discriminating Developers - JavaZone 2011

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;

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 49: Java Bytecode for Discriminating Developers - JavaZone 2011

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;

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 50: Java Bytecode for Discriminating Developers - JavaZone 2011

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;

public class Hello {

public static void main(String[] args) {

System.out.println ( “Hello, World!” );

}

}

Page 51: Java Bytecode for Discriminating Developers - JavaZone 2011

STACK

MACHINE

Page 52: Java Bytecode for Discriminating Developers - JavaZone 2011

Stack Machine

Page 53: Java Bytecode for Discriminating Developers - JavaZone 2011

Stack Machine

JVM is a stack-based machine

Page 54: Java Bytecode for Discriminating Developers - JavaZone 2011

Stack Machine

JVM is a stack-based machine

Each thread has a stack

Page 55: Java Bytecode for Discriminating Developers - JavaZone 2011

Stack Machine

JVM is a stack-based machine

Each thread has a stack

Stack stores frames

Page 56: Java Bytecode for Discriminating Developers - JavaZone 2011

Stack Machine

JVM is a stack-based machine

Each thread has a stack

Stack stores frames

Frame is created on method

invocation

Page 57: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

Operand stack

Local variables

2 0 1 N …

Constant

Pool

#1

Page 59: Java Bytecode for Discriminating Developers - JavaZone 2011

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: areturn

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this LGet;

public class Get {

String name;

public String getName() {

return name;

}

}

Page 60: Java Bytecode for Discriminating Developers - JavaZone 2011

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: areturn

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this LGet;

public class Get {

String name;

public String getName() {

return name;

}

}

Page 61: Java Bytecode for Discriminating Developers - JavaZone 2011

aload_0 getfield 00 02 areturn

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: areturn

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this LGet;

0 1 2 3 4

Page 62: Java Bytecode for Discriminating Developers - JavaZone 2011

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: areturn

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this LGet;

2A B4 00 02 B0

0 1 2 3 4

Page 63: Java Bytecode for Discriminating Developers - JavaZone 2011
Page 64: Java Bytecode for Discriminating Developers - JavaZone 2011

STACK

JUGGLING

Page 65: Java Bytecode for Discriminating Developers - JavaZone 2011

A B

dup

pop

swap

dup_x1

dup2_x1

Page 66: Java Bytecode for Discriminating Developers - JavaZone 2011

A

B

dup

pop

swap

dup_x1

dup2_x1

A

Page 67: Java Bytecode for Discriminating Developers - JavaZone 2011

dup

pop

swap

dup_x1

dup2_x1

A B

Page 68: Java Bytecode for Discriminating Developers - JavaZone 2011

dup

pop

swap

dup_x1

dup2_x1

A B

Page 69: Java Bytecode for Discriminating Developers - JavaZone 2011

dup

pop

swap

dup_x1

dup2_x1

A B

B

Page 70: Java Bytecode for Discriminating Developers - JavaZone 2011

dup

pop

swap

dup_x1

dup2_x1

A B

B B A

Page 71: Java Bytecode for Discriminating Developers - JavaZone 2011

How do you

swap doubles?

Page 72: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

Page 73: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0 0.0

Page 74: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1 1.0

0.0

Page 75: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

swap

1.0

0.0

Page 76: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

swap

1.0

0.0

not allowed!

Page 77: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

swap2

1.0

0.0

Page 78: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

swap2

1.0

0.0

doesn’t

exist

Page 79: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

dup2_x2

1.0

0.0

1.0

Page 80: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

dup2_x2

pop2

0.0

1.0

Page 81: Java Bytecode for Discriminating Developers - JavaZone 2011

dup2_x2

dconst_0

dconst_1

dup2_x2

pop2

0.0

1.0

profit!

Page 82: Java Bytecode for Discriminating Developers - JavaZone 2011

LOCAL

VARIABLES

Page 83: Java Bytecode for Discriminating Developers - JavaZone 2011

Local Variables

public int calculate(int value) {

return value + 42;

}

Page 84: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public int calculate(int value) {

return value + 42;

}

Page 85: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public int calculate(int value) {

return value + 42;

}

Page 86: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public int calculate(int value) {

return value + 42;

}

Page 87: Java Bytecode for Discriminating Developers - JavaZone 2011

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

The table

maps

numbers to

names

Local Variables

public int calculate(int value) {

return value + 42;

}

Page 88: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public int calculate(int value) {

return value + 42;

}

Page 89: Java Bytecode for Discriminating Developers - JavaZone 2011

ldc "Hello"

astore_0

iconst_1

astore_1

aload_0

depth value

Stack

var value

Local Variables

0

1

2

3

4

0

1

2

3

4

Page 90: Java Bytecode for Discriminating Developers - JavaZone 2011

ldc "Hello"

astore_0

iconst_1

astore_1

aload_0

depth value

Stack

var value

Local Variables

"Hello" 0

1

2

3

4

0

1

2

3

4

Page 91: Java Bytecode for Discriminating Developers - JavaZone 2011

ldc "Hello"

astore_0

iconst_1

astore_1

aload_0

depth value var value

Local Variables

"Hello" 0

1

2

3

4

0

1

2

3

4

Stack

Page 92: Java Bytecode for Discriminating Developers - JavaZone 2011

ldc "Hello"

astore_0

iconst_1

astore_1

aload_0

depth value

Stack

var value

Local Variables

"Hello" 0

1

2

3

4

0

1

2

3

4

1

Page 93: Java Bytecode for Discriminating Developers - JavaZone 2011

ldc "Hello"

astore_0

iconst_1

astore_1

aload_0

depth value

Stack

var value

Local Variables

"Hello" 0

1

2

3

4

0

1

2

3

4

1

Page 94: Java Bytecode for Discriminating Developers - JavaZone 2011

ldc "Hello"

astore_0

iconst_1

astore_1

aload_0

depth value

Stack

var value

Local Variables

"Hello" 0

1

2

3

4

0

1

2

3

4

1

"Hello"

Page 95: Java Bytecode for Discriminating Developers - JavaZone 2011

Stack Local

Variables

Table

store

load

Page 96: Java Bytecode for Discriminating Developers - JavaZone 2011

OBJECTS

Page 97: Java Bytecode for Discriminating Developers - JavaZone 2011

new

<init>

<clinit> Instance initialization method

Class and interface

initialization method

Object Initialization

0xBB

Page 98: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Initializer {

static int a;

static int b;

static { a = 1; }

static { b = 2; }

}

Page 99: Java Bytecode for Discriminating Developers - JavaZone 2011

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>

public class Initializer {

static int a;

static int b;

static { a = 1; }

static { b = 2; }

}

Page 100: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: new

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 101: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: new

public Initializer();

Code:

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 102: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: new

public Initializer();

Code:

0: aload_0

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 103: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: new

public Initializer();

Code:

0: aload_0

1: invokespecial #1; //Method java/lang/Object."<init>":()V

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 104: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: new

public Initializer();

Code:

0: aload_0

1: invokespecial #1; //Method java/lang/Object."<init>":()V

4: aload_0

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 105: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 106: Java Bytecode for Discriminating Developers - JavaZone 2011

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;

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 107: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 108: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Initializer {

Object o;

public Initializer() {

o = new Object();

}

}

Page 109: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: {}

public class Initializer {

int a;

int b;

int c;

{ a = 1; }

public Initializer(int b) {

this.b = b;

}

{ c = 2; }

}

Page 110: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: {}

public class Initializer {

int a;

int b;

int c;

{ a = 1; }

public Initializer(int b) {

this.b = b;

}

{ c = 2; }

}

Page 111: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: {}

public class Initializer {

int a;

int b;

int c;

{ a = 1; }

public Initializer(int b) {

this.b = b;

}

{ c = 2; }

}

Page 112: Java Bytecode for Discriminating Developers - JavaZone 2011

Object Initialization: {}

public class Initializer {

int a;

int b;

int c;

{ a = 1; }

public Initializer(int b) {

this.b = b;

}

{ c = 2; }

}

Page 113: Java Bytecode for Discriminating Developers - JavaZone 2011

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

public class Initializer {

int a;

int b;

int c;

{ a = 1; }

public Initializer(int b) {

this.b = b;

}

{ c = 2; }

}

Page 114: Java Bytecode for Discriminating Developers - JavaZone 2011
Page 115: Java Bytecode for Discriminating Developers - JavaZone 2011
Page 116: Java Bytecode for Discriminating Developers - JavaZone 2011

There’s no initializer

Page 117: Java Bytecode for Discriminating Developers - JavaZone 2011

METHOD INVOCATION

&

PARAMETER PASSING

METHOD

INVOCATION

Page 118: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

Page 119: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

Page 120: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic Integer.valueOf(“42”)

Page 121: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

<init>

private void foo();

super.method();

Page 122: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

class A A/method1

A/method2

Page 123: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

class A

class B

A/method1

A/method2

Page 124: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

class A

class B

A/method1

A/method2

A/method1

B/method2

B/method3

Page 125: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

class A

class B impl X

A/method1

A/method2

A/method1

B/method2

B/method3

X/methodX

Page 126: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

class A

class B impl X

A/method1

A/method2

A/method1

B/method2

B/method3

X/methodX class D impl X

D/method1

X/methodX

Page 127: Java Bytecode for Discriminating Developers - JavaZone 2011

Java Method Invocation

invokestatic

invokespecial

invokevirtual

invokeinterface

invokedynamic

class A

class B impl X

A/method1

A/method2

A/method1

B/method2

B/method3

X/methodX class D impl X

D/method1

X/methodX

Page 128: Java Bytecode for Discriminating Developers - JavaZone 2011

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

Page 129: Java Bytecode for Discriminating Developers - JavaZone 2011

Method Invocation

obj.method(param1, param2);

Page 130: Java Bytecode for Discriminating Developers - JavaZone 2011

Method Invocation

obj.method(param1, param2);

push obj

push param1

push param2

call method

Page 131: Java Bytecode for Discriminating Developers - JavaZone 2011

Method Invocation

obj.method(param1, param2); obj

push obj

push param1

push param2

call method

Page 132: Java Bytecode for Discriminating Developers - JavaZone 2011

Method Invocation

obj.method(param1, param2);

obj

param1 push obj

push param1

push param2

call method

Page 133: Java Bytecode for Discriminating Developers - JavaZone 2011

Method Invocation

obj.method(param1, param2);

obj

param1

param2 push obj

push param1

push param2

call method

Page 134: Java Bytecode for Discriminating Developers - JavaZone 2011

Method Invocation

obj.method(param1, param2); obj?

push obj

push param1

push param2

call method

Page 135: Java Bytecode for Discriminating Developers - JavaZone 2011

INNER

CLASSES

Page 136: Java Bytecode for Discriminating Developers - JavaZone 2011

Inner Classes

public class Car {

class Engine {

public void start() {

move();

}

}

private void move() {

}

}

Page 137: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

Inner Classes

public 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: Java Bytecode for Discriminating Developers - JavaZone 2011

Inner Classes

public 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: Java Bytecode for Discriminating Developers - JavaZone 2011

“HOW DO THEY DO THAT?”

Page 141: Java Bytecode for Discriminating Developers - JavaZone 2011

object Singleton {

def test={}

}

Page 142: Java Bytecode for Discriminating Developers - JavaZone 2011

object Singleton {

def test={}

}

$> scalac Singleton.scala

Singleton.class Singleton$.class

Page 143: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

object Singleton {

def test={}

}

Page 151: Java Bytecode for Discriminating Developers - JavaZone 2011

object Singleton {

def test={}

}

public class Singleton {

public void test(){

Singleton$.MODULE$.test();

}

}

Page 152: Java Bytecode for Discriminating Developers - JavaZone 2011

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: Java Bytecode for Discriminating Developers - JavaZone 2011

CRASH!

BOOM!

BANG!

Page 154: Java Bytecode for Discriminating Developers - JavaZone 2011

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

Page 155: Java Bytecode for Discriminating Developers - JavaZone 2011

for(int i = 0; i < 100; i++){

int a = 0;

try {

while (true) {

a++;

foo(a);

if(a > 1) break;

}

} catch (Exception e) {

}

}

Page 156: Java Bytecode for Discriminating Developers - JavaZone 2011

Javassist

for(int i = 0; i < 100; i++){

int a = 0;

try {

while (true) {

a++;

foo(a);

if(a > 1) break;

}

} catch (Exception e) {

}

}”);

method.setBody(“

CtMethod method = …

Page 157: Java Bytecode for Discriminating Developers - JavaZone 2011

Exception in thread "main" java.lang.VerifyError:

(class: zt/javassist/My, method: test signature:

()V) Inconsistent stack height 0 != 1

-Xverify:all

Page 158: Java Bytecode for Discriminating Developers - JavaZone 2011

public void test();

Code:

Stack=2, Locals=4, Args_size=1

0: iconst_0

1: istore_1

2: iload_1

3: bipush 100

5: if_icmpge 42

8: iconst_0

9: istore_2

10: goto 29

13: iinc 2, 1

16: aload_0

17: iload_2

18: invokevirtual #23; //Method zt/javassist/My.foo:(I)V

21: iload_2

22: iconst_1

23: if_icmple 29

26: goto 32

29: goto 13

32: astore_3

33: goto 36

36: iinc 1, 1

39: goto 2

42: return

Exception table:

from to target type

10 32 32 Class java/lang/Exception

Page 159: Java Bytecode for Discriminating Developers - JavaZone 2011

public void test();

Code:

Stack=2, Locals=4, Args_size=1

0: iconst_0

1: istore_1

2: iload_1

3: bipush 100

5: if_icmpge 42

8: iconst_0

9: istore_2

10: goto 29

13: iinc 2, 1

16: aload_0

17: iload_2

18: invokevirtual #23; //Method zt/javassist/My.foo:(I)V

21: iload_2

22: iconst_1

23: if_icmple 29

26: goto 32

29: goto 13

32: astore_3

33: goto 36

36: iinc 1, 1

39: goto 2

42: return

Exception table:

from to target type

10 32 32 Class java/lang/Exception

No local

variables table

Page 160: Java Bytecode for Discriminating Developers - JavaZone 2011

public void test();

Code:

Stack=2, Locals=4, Args_size=1

0: iconst_0

1: istore_1

2: iload_1

3: bipush 100

5: if_icmpge 42

8: iconst_0

9: istore_2

10: goto 29

13: iinc 2, 1

16: aload_0

17: iload_2

18: invokevirtual #23; //Method zt/javassist/My.foo:(I)V

21: iload_2

22: iconst_1

23: if_icmple 29

26: goto 32

29: goto 13

32: astore_3

33: goto 36

36: iinc 1, 1

39: goto 2

42: return

Exception table:

from to target type

10 32 32 Class java/lang/Exception

No local

variables table

Page 161: Java Bytecode for Discriminating Developers - JavaZone 2011

Bytecode is fun!

Know your platform!

Maybe, you can build your own language?

You may need to read bytecode someday.

Page 162: Java Bytecode for Discriminating Developers - JavaZone 2011

http://arhipov.blogspot.com

[email protected]

@antonarhipov

@javarebel