java bytecode for discriminating developers - geecon 2011

167
Java Bytecode for Discriminating Developers Anton Arhipov

Upload: anton-arhipov

Post on 10-May-2015

8.326 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Java Bytecode For Discriminating Developers - GeeCON 2011

Java Bytecode for Discriminating Developers

Anton Arhipov

Page 2: Java Bytecode For Discriminating Developers - GeeCON 2011

whoami

http://arhipov.blogspot.com@antonarhipov

@javarebel

Anton ArhipovJava dev. / Product Lead

JRebel

Page 3: Java Bytecode For Discriminating Developers - GeeCON 2011

Who-are-you?

Page 4: Java Bytecode For Discriminating Developers - GeeCON 2011

The Master Plan

80%: Bytecode 101

20%: Examples

Page 5: Java Bytecode For Discriminating Developers - GeeCON 2011

THE INTRO

Page 6: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

Page 7: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 21 2

+

Page 8: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

1 2 +

1 2+

Page 9: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

1 2 +

1 2+

Page 10: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

1 2 + PUSH 1 1

1 2+

Page 11: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

1 2 + PUSH 1PUSH 2

21

1 2+

Page 12: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

1 2 + PUSH 1PUSH 2ADD

3

1 2+

Page 13: Java Bytecode For Discriminating Developers - GeeCON 2011

1 + 2

1 2 + ICONST_1ICONST_2IADD

3

1 2+

Page 14: Java Bytecode For Discriminating Developers - GeeCON 2011

? = 1 + 2

Page 15: Java Bytecode For Discriminating Developers - GeeCON 2011

TAXONOMY

Page 16: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode

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

Page 17: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode

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

Page 18: Java Bytecode For Discriminating Developers - GeeCON 2011

TYPE OPERATION

Page 19: Java Bytecode For Discriminating Developers - GeeCON 2011

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

TYPE OPERATION

Page 20: Java Bytecode For Discriminating Developers - GeeCON 2011

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

iconst_1)

TYPE OPERATION

Page 21: Java Bytecode For Discriminating Developers - GeeCON 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 22: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode Taxonomy

Stack Manipulation

Page 23: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode Taxonomy

Stack Manipulation

FlowControl

Page 24: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode Taxonomy

Stack Manipulation

FlowControl

Object Model

Page 25: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode Taxonomy

Stack Manipulation

FlowControl

ArithmeticsObject Model

Page 26: Java Bytecode For Discriminating Developers - GeeCON 2011

Bytecode Taxonomy

Stack Manipulation

FlowControl

ArithmeticsObject Model

monitorentermonitorexit

Page 27: Java Bytecode For Discriminating Developers - GeeCON 2011

TOOLING

Page 28: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

HELLO WORLD!

Page 30: Java Bytecode For Discriminating Developers - GeeCON 2011
Page 31: Java Bytecode For Discriminating Developers - GeeCON 2011

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

Page 32: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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

Page 44: Java Bytecode For Discriminating Developers - GeeCON 2011

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

Page 45: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 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;

Page 48: Java Bytecode For Discriminating Developers - GeeCON 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;

Page 49: Java Bytecode For Discriminating Developers - GeeCON 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;

Page 50: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

STACK MACHINE

Page 52: Java Bytecode For Discriminating Developers - GeeCON 2011

Stack Machine

Page 53: Java Bytecode For Discriminating Developers - GeeCON 2011

Stack Machine

• JVM is a stack-based machine

Page 54: Java Bytecode For Discriminating Developers - GeeCON 2011

Stack Machine

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

Page 55: Java Bytecode For Discriminating Developers - GeeCON 2011

Stack Machine

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

Page 56: Java Bytecode For Discriminating Developers - GeeCON 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 - GeeCON 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 - GeeCON 2011

The Frame

Operand stack

Local variables

31 2 N…

Constant Pool

#1

Page 59: Java Bytecode For Discriminating Developers - GeeCON 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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 60: Java Bytecode For Discriminating Developers - GeeCON 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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

aload_0 getfield 00 02 areturn

0 1 2 3 4

Page 61: Java Bytecode For Discriminating Developers - GeeCON 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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

2A B4 00 02 B0

0 1 2 3 4

Page 62: Java Bytecode For Discriminating Developers - GeeCON 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: areturnLocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;

Page 63: Java Bytecode For Discriminating Developers - GeeCON 2011

STACK CRUNCHING

Page 64: Java Bytecode For Discriminating Developers - GeeCON 2011

AB

duppopswapdup_x1dup2_x2

Page 65: Java Bytecode For Discriminating Developers - GeeCON 2011

A

B

duppopswapdup_x1dup2_x2

A

Page 66: Java Bytecode For Discriminating Developers - GeeCON 2011

duppopswapdup_x1dup2_x2

AB

Page 67: Java Bytecode For Discriminating Developers - GeeCON 2011

duppopswapdup_x1dup2_x2

AB

Page 68: Java Bytecode For Discriminating Developers - GeeCON 2011

duppopswapdup_x1dup2_x2

AB

B

Page 69: Java Bytecode For Discriminating Developers - GeeCON 2011

duppopswapdup_x1dup2_x2

AB

BBA

Page 70: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

How do you swap doubles?

Page 71: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

Page 72: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_00.0

Page 73: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1 1.0

0.0

Page 74: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1swap

1.0

0.0

Page 75: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1swap

1.0

0.0

not allowed!

Page 76: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1swap2

1.0

0.0

Page 77: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1swap2

1.0

0.0

doesn’texist

Page 78: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1dup2_x2

1.0

0.0

1.0

Page 79: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1dup2_x2pop2

0.0

1.0

Page 80: Java Bytecode For Discriminating Developers - GeeCON 2011

dup2_x2

dconst_0dconst_1dup2_x2pop2

0.0

1.0

profit!

Page 81: Java Bytecode For Discriminating Developers - GeeCON 2011

LOCAL VARIABLES

Page 82: Java Bytecode For Discriminating Developers - GeeCON 2011

Local Variables

Page 83: Java Bytecode For Discriminating Developers - GeeCON 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

Page 84: Java Bytecode For Discriminating Developers - GeeCON 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

numbered

from 0

Local Variables

Page 85: Java Bytecode For Discriminating Developers - GeeCON 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

instance methodshave this at 0

Page 86: Java Bytecode For Discriminating Developers - GeeCON 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

Page 87: Java Bytecode For Discriminating Developers - GeeCON 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

Page 88: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

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: Java Bytecode For Discriminating Developers - GeeCON 2011

StackLocal

Variables Table

store

load

Page 95: Java Bytecode For Discriminating Developers - GeeCON 2011

OBJECTS

Page 96: Java Bytecode For Discriminating Developers - GeeCON 2011

new <init> <clinit>

Instance initialization method

Class and interface initialization method

Object Initialization

0xBB

Page 97: Java Bytecode For Discriminating Developers - GeeCON 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

Page 98: Java Bytecode For Discriminating Developers - GeeCON 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>

Page 99: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: new

Page 100: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: new

public Initializer(); Code:

Page 101: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: new

public Initializer(); Code: 0: aload_0

Page 102: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: new

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

Page 103: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: new

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

Page 104: Java Bytecode For Discriminating Developers - GeeCON 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

Page 105: Java Bytecode For Discriminating Developers - GeeCON 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;

Page 106: Java Bytecode For Discriminating Developers - GeeCON 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

Page 107: Java Bytecode For Discriminating Developers - GeeCON 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

Page 108: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: {}

Page 109: Java Bytecode For Discriminating Developers - GeeCON 2011

Object Initialization: {}

?

Page 110: Java Bytecode For Discriminating Developers - GeeCON 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

Page 111: Java Bytecode For Discriminating Developers - GeeCON 2011
Page 112: Java Bytecode For Discriminating Developers - GeeCON 2011

There’s no initializer

Page 113: Java Bytecode For Discriminating Developers - GeeCON 2011

METHOD INVOCATION&

PARAMETER PASSING

Page 114: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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 115: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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

Integer.valueOf(“42”)

Page 116: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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

<init>

private void foo();

super.method();

Page 117: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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 AA/method1A/method2

Page 118: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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

A/method1A/method2

Page 119: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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

A/method1A/method2

A/method1B/method2B/method3

Page 120: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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

Page 121: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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 class D impl X

D/method1X/methodX

Page 122: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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 class D impl X

D/method1X/methodX

Page 123: Java Bytecode For Discriminating Developers - GeeCON 2011

Methods & Parameters

• 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 124: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

obj.method(param1, param2);

Page 125: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

Page 126: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj

Page 127: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj

param1

Page 128: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj

param1

param2

Page 129: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

obj.method(param1, param2);

push objpush param1push param2call method

obj?

Page 130: Java Bytecode For Discriminating Developers - GeeCON 2011

Method Invocation

this.add(1, 2);

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

Page 131: Java Bytecode For Discriminating Developers - GeeCON 2011

INNER CLASSES

Page 132: Java Bytecode For Discriminating Developers - GeeCON 2011

Inner Classes

Page 133: Java Bytecode For Discriminating Developers - GeeCON 2011

Inner Classes

Page 134: Java Bytecode For Discriminating Developers - GeeCON 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 135: Java Bytecode For Discriminating Developers - GeeCON 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 136: Java Bytecode For Discriminating Developers - GeeCON 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 137: Java Bytecode For Discriminating Developers - GeeCON 2011

“HOW DO THEY DO THAT?”

Page 138: Java Bytecode For Discriminating Developers - GeeCON 2011

object Singleton { def test={}}

Page 139: Java Bytecode For Discriminating Developers - GeeCON 2011

object Singleton { def test={}}

$> scalac Singleton.scala

Singleton.class Singleton$.class

Page 140: Java Bytecode For Discriminating Developers - GeeCON 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 141: Java Bytecode For Discriminating Developers - GeeCON 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 142: Java Bytecode For Discriminating Developers - GeeCON 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 143: Java Bytecode For Discriminating Developers - GeeCON 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 144: Java Bytecode For Discriminating Developers - GeeCON 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 145: Java Bytecode For Discriminating Developers - GeeCON 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 146: Java Bytecode For Discriminating Developers - GeeCON 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 147: Java Bytecode For Discriminating Developers - GeeCON 2011

object Singleton { def test={}}

Page 148: Java Bytecode For Discriminating Developers - GeeCON 2011

object Singleton { def test={}}

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

Page 149: Java Bytecode For Discriminating Developers - GeeCON 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 150: Java Bytecode For Discriminating Developers - GeeCON 2011

class Groovy { }

Page 151: Java Bytecode For Discriminating Developers - GeeCON 2011

class Groovy { }

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

Page 152: Java Bytecode For Discriminating Developers - GeeCON 2011

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 153: Java Bytecode For Discriminating Developers - GeeCON 2011

CRASH! BOOM! BANG!

Page 154: Java Bytecode For Discriminating Developers - GeeCON 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 - GeeCON 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 - GeeCON 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 157: Java Bytecode For Discriminating Developers - GeeCON 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 158: Java Bytecode For Discriminating Developers - GeeCON 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 159: Java Bytecode For Discriminating Developers - GeeCON 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 160: Java Bytecode For Discriminating Developers - GeeCON 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 161: Java Bytecode For Discriminating Developers - GeeCON 2011

-noverify

Page 162: Java Bytecode For Discriminating Developers - GeeCON 2011

## A fatal error has been detected by the Java Runtime Environment:## EXCEPTION_ACCESS_VIOLATION (0xc0000005) at # pc=0x01adff06, pid=7732, tid=868## JRE version: 6.0_21-b07# Java VM: Java HotSpot(TM) Client VM (17.0-b17 mixed mode, # sharing windows-x86 )# Problematic frame:# j zt.javassist.My.test()V+20## An error report file with more information is saved as:# C:\work\puzzlers\hs_err_pid7732.log## If you would like to submit a bug report, please visit:# http://java.sun.com/webapps/bugreport/crash.jsp#

-noverify

Page 163: Java Bytecode For Discriminating Developers - GeeCON 2011

Exception in thread "main" java.lang.VerifyError: (class: zt/javassist/My, method: test signature: ()V) Inconsistent stack height 0 != 1

-Xverify:all

Page 164: Java Bytecode For Discriminating Developers - GeeCON 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 165: Java Bytecode For Discriminating Developers - GeeCON 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 166: Java Bytecode For Discriminating Developers - GeeCON 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 167: Java Bytecode For Discriminating Developers - GeeCON 2011

Q/A