SlideShare a Scribd company logo
Programming
JVM Bytecode
Joe Kutner
@codefinger
JVM Langs Owner
@Heroku
.class.java
$ cat Main.class
????3
<init>()VCodeLineNumberTablemain([Ljava/lang/
String;)V
SourceFile Main.java
java/util/ArrayListHello
Mainjava/lang/Objectadd(Ljava/lang/Object;)Z!
*??
*?Y??W?
javap
class Main {
public static void main(String[] args) {
(new ArrayList<String>()).add("Hello");
}
}
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object...
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList...
7: ldc #4 // String Hello
9: invokevirtual #5 // Method java/util/ArrayList...
12: pop
13: return
}
$ javac Main.java
$ javap -c Main
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
[POSITION]: [OPERATION] [OPERAND]
0: new #2
[POSITION]: [OPERATION] [OPERAND]
Location of the instruction in
the raw binary data
[POSITION]: [OPERATION] [OPERAND]
A mnemonic that represents one of
the 256 possible opcodes
[POSITION]: [OPERATION] [OPERAND]
Arguments to the operation.
The number and type of these
depends on the operation in use.
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
$ javap -v -c Main
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
Stack-Based Model of
Computation
Exception in thread "main" java.lang.NullPointerException
at Printer.printString(Printer.java:13)
at Printer.print(Printer.java:9)
at Printer.main(Printer.java:19)
Stack Frame
Operand
Stack
Local
Variable
Array
Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
Stack Frame
Operand StackLocal Vars Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
invokespecial
Used to invoke an initializer, private method, or superclass method
invokeinterface
Used to invoke an interface method
invokestatic
Used to invoke a class-level method (i.e. static methods)
invokevirtual
Used to invoke an instance method
invokedynamic
Used to invoke methods dynamically (new shiny)
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
$ javap -v -c Main
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
Stack Frame
Operand StackLocal Vars Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
#18 = Utf8 Hello
#19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z
$ javap -v -c Main
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<“Hello”>
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<“Hello”>
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
#18 = Utf8 Hello
#19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z
$ javap -v -c Main
java/util/ArrayList.add:(Ljava/lang/Object;)Z
B - byte
C - char
S - short
I - int
J - long
F - float
D - double
Z - boolean
V - void
L - object
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
“Hello”
Object
“Hello”
...
Methodref
Target
Arguments
Operand Stack
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
<“Hello”>
Stack Frame
Operand StackLocal Vars Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
true
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
true
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
swap
iadd
getstatic [CLASS] [FIELD]
iconst_1
Writing
JVM Bytecode
000000B0: 73 01 00 0A 4C 43 6F 6D 70 69 6C 65 72 3B 01 00
000000C0: 07 63 6F 6D 70 69 6C 65 01 00 32 28 5B 4C 6A 61
000000D0: 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29
000000E0: 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63 72 69
000000F0: 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01 00 06
00000100: 74 6F 6B 65 6E 73 01 00 13 5B 4C 6A 61 76 61 2F
00000110: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 04 6D
00000120: 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61
00000130: 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 04 61
00000140: 72 67 73 01 00 09 6A 69 74 65 43 6C 61 73 73 01
00000150: 00 1D 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63
00000160: 72 69 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01
00000170: 00 06 6F 75 74 70 75 74 01 00 1A 4C 6A 61 76 61
00000180: 2F 69 6F 2F 46 69 6C 65 4F 75 74 70 75 74 53 74
00000190: 72 65 61 6D 3B 01 00 0A 45 78 63 65 70 74 69 6F
000001A0: 6E 73 07 00 3A 01 00 0A 53 6F 75 72 63 65 46 69
000001B0: 6C 65 01 00 0A 43 6F 6D 70 69 6C 65 72 2E 6A 61
000001C0: 76 61 0C 00 14 00 15 01 00 0A 43 6F 6D 70 69 6C
000001D0: 65 72 24 31 01 00 04 4D 61 69 6E 0C 00 14 00 3B
000001E0: 01 00 08 43 6F 6D 70 69 6C 65 72 0C 00 1B 00 1C
ASM
Programming JVM Bytecode
MethodVisitor mv = cv.visitMethod(
Opcodes.ACC_PRIVATE,
"setupLogger",
"(Lorg/apache/maven/cli/MavenCli$CliRequest;)Lorg/codehaus/
plexus/logging/Logger;", null, null);
mv.visitCode();
mv.visitTypeInsn(
Opcodes.NEW,
"com/github/jcgay/maven/color/logger/AnsiColorLogger");
https://github.com/jcgay/maven-color
Jitescript
An ECMAScript runtime for the JVM
JiteClass
➤ CodeBlock
➤ CodeBlock
➤ CodeBlock
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main...
Code:
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
}
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
// ...
}});
}};
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
new(p(ArrayList.class));
dup();
invokestatic(
p(ArrayList.class), ”<init>”, sig(void.class));
ldc(“Hello”)
invokevirtual(
p(ArrayList.class), “add”,
sig(boolean.class, Object.class));
pop();
voidreturn();
}});
}};
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
getstatic(p(System.class), "out", ci(PrintStream.class));
ldc(“42");
invokevirtual(
p(PrintStream.class),
"println",
sig(void.class, Object.class));
voidreturn();
}});
}};
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
getstatic(p(System.class), "out", ci(PrintStream.class));
ldc(“42");
invokevirtual(
p(PrintStream.class),
"println",
sig(void.class, Object.class));
voidreturn();
}});
}};
0: getstatic #13
3: ldc #15
5: invokevirtual #21
8: return
JiteClass .class
.toBytes()
Brainfu++
> > + + + + + + [ - s + + + + + + + s ] < p
p
>
<
: print a variable
: push a 0 onto the stack
: pop the top value off of the stack
+
-
[
: increment a variable
: decrement a variable
: start a loop
] : end a loop
s : swap the top two values of the stack
This is our machine:
An empty stack
> > + + + + + + [ - s + + + + + + + s ] < p
> > + + + + + + [ - s + + + + + + + s ] < p
Push two zeros
0
0
> > + + + + + + [ - s + + + + + + + s ] < p
Inc to 6
0
6
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
0
6
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
0
5
Decrement
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
5
0
Swap
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
5
7
Increment
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
7
5
Swap
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
7
5
End of loop
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
42
0
Repeat until 0
> > + + + + + + [ - s + + + + + + + s ] < p
42
Pop and Print
public JiteClass compile(final String program) {
return new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
// ...
}});
}};
}
for (String cmd : program.split(“ “)) {
if ("p".equals(cmd)) {
} else if ("+".equals(cmd)) {
} else if ("-".equals(cmd)) {
} else if (">".equals(cmd)) {
} else if ("<".equals(cmd)) {
} else if ("s".equals(cmd)) {
} else if ("[".equals(cmd)) {
} else if ("]".equals(cmd)) {
}
}
Programming JVM Bytecode
for (String cmd : program.split(“ “)) {
if ("p".equals(cmd)) {
} else if ("+".equals(cmd)) {
} else if ("-".equals(cmd)) {
} else if (">".equals(cmd)) {
} else if ("<".equals(cmd)) {
} else if ("s".equals(cmd)) {
} else if ("[".equals(cmd)) {
} else if ("]".equals(cmd)) {
}
}
if ("p".equals(cmd)) {
dup();
invokestatic(
p(String.class),
"valueOf",
sig(String.class, int.class));
getstatic(p(System.class), "out", ci(PrintStream.class));
swap();
invokevirtual(
p(PrintStream.class),
"print",
sig(void.class, Object.class));
}
if ("p".equals(cmd)) {
brainPrint();
}
else if ("+".equals(cmd)) {
iconst_1();
iadd();
}
else if (“-".equals(cmd)) {
iconst_1();
isub();
}
else if (“>".equals(cmd)) {
iconst_0();
}
else if (“<".equals(cmd)) {
pop();
}
else if (“s".equals(cmd)) {
swap();
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
else if (“]“.equals(cmd)) {
LabelNode[] labelNodes = loopStack.pop();
LabelNode begin = labelNodes[0];
LabelNode end = labelNodes[1];
go_to(begin);
label(end);
}
14: dup
15: ifeq 39
...
36: goto 14
39: pop
$ java Compiler “< < + + +”
$ java Main
42
public class BrainCodeBlock extends CodeBlock {
public void brainPrint(String s) { /* ... */ }
public void brainPush(BrainObject o) { /* ... */ }
public BrainObject brainPop() { /* ... */ }
public void brainLoop(Predicate<CodeBlock> b) {
// ...
}
}
Javassist
CtClass
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("test.Rectangle");
cc.setSuperclass(pool.get("test.Point"));
cc.writeFile();
class ThirdParty {
public void run() {
fetchData();
processData();
invokeService();
resolveConflicts();
finalize();
}
}
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get(“ThirdParty");
CtMethod m = cc.getDeclaredMethod(“fetchData");
m.addLocalVariable("t", CtClass.longType);
m.insertBefore(
"t = System.currentTimeMillis();");
m.insertAfter(
“{“ +
“ t = System.currentTimeMillis() - t;” +
“ System.out.println("Time (ms): " + t);” +
”}");
byte[] byteCode = cc.toBytecode();
cc.detach();
http://www.tomsquest.com/blog/2014/01/intro-java-agent-and-bytecode-manipulation/
calling ThirdParty
fetching data...
Time (ms): 55
processing data...
Time (ms): 6032
Make a DSL…
No, make a new
JVM Language
(print (* 7 5))
pragprog.com
The Dragon Book
Brainfu** (Jipsy)
List of JVM Bytecode Operations
http://github.com/jkutner/jipsy
http://docs.oracle.com/javase/specs/jvms/se8/html/
Jitescript
https://github.com/qmx/jitescript
The next time you compile…
Run javap against the class file.
Thank You
Joe Kutner
@codefinger

More Related Content

PDF
Programming JVM Bytecode with Jitescript
PDF
Java Generics - by Example
KEY
SPL, not a bridge too far
PDF
Hidden Gems of Ruby 1.9
PDF
Publishing a Perl6 Module
PDF
Thoughts On Learning A New Programming Language
PDF
Perl Sucks - and what to do about it
PDF
Better detection of what modules are used by some Perl 5 code
Programming JVM Bytecode with Jitescript
Java Generics - by Example
SPL, not a bridge too far
Hidden Gems of Ruby 1.9
Publishing a Perl6 Module
Thoughts On Learning A New Programming Language
Perl Sucks - and what to do about it
Better detection of what modules are used by some Perl 5 code

What's hot (20)

PPT
2016年のPerl (Long version)
ODP
Nigel hamilton-megameet-2013
PDF
Practical JavaScript Programming - Session 6/8
PDF
Melhorando sua API com DSLs
KEY
Zen: Building Maintainable Catalyst Applications
KEY
Anatomy of a PHP Request ( UTOSC 2010 )
PDF
Java Class Design
PPTX
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
PPTX
Java Bytecode: Passing Parameters
PDF
Python Tutorial
PDF
TDOH 南區 WorkShop 2016 Reversing on Windows
KEY
10 Catalyst Tips
PPTX
Jdk 7 4-forkjoin
PDF
Perl 5.28 new features
PDF
C++ The Principles of Most Surprise
PDF
The Ring programming language version 1.8 book - Part 96 of 202
PDF
SfCon: Test Driven Development
PDF
Unit testing with PHPUnit
PDF
6 things about perl 6
TXT
System programs in C language.
2016年のPerl (Long version)
Nigel hamilton-megameet-2013
Practical JavaScript Programming - Session 6/8
Melhorando sua API com DSLs
Zen: Building Maintainable Catalyst Applications
Anatomy of a PHP Request ( UTOSC 2010 )
Java Class Design
NTUSTxTDOH 資訊安全基礎工作坊 基礎逆向教育訓練
Java Bytecode: Passing Parameters
Python Tutorial
TDOH 南區 WorkShop 2016 Reversing on Windows
10 Catalyst Tips
Jdk 7 4-forkjoin
Perl 5.28 new features
C++ The Principles of Most Surprise
The Ring programming language version 1.8 book - Part 96 of 202
SfCon: Test Driven Development
Unit testing with PHPUnit
6 things about perl 6
System programs in C language.
Ad

Similar to Programming JVM Bytecode (20)

PDF
In Vogue Dynamic
PPTX
Java Bytecode For Discriminating Developers - GeeCON 2011
PDF
Advanced Debugging Using Java Bytecodes
PPTX
Java Bytecode Fundamentals - JUG.lv
PDF
Pimp My Java LavaJUG
PDF
No dark magic - Byte code engineering in the real world
PDF
Inside the JVM - Follow the white rabbit! / Breizh JUG
PPT
Ruby: OOP, metaprogramming, blocks, iterators, mix-ins, duck typing. Code style
PDF
Java Bytecode for Discriminating Developers - JavaZone 2011
PPTX
Mastering Java Bytecode - JAX.de 2012
PDF
Improving Android Performance at Droidcon UK 2014
PDF
How Scala code is expressed in the JVM
PDF
Improving Java performance at JBCNConf 2015
PPT
Mastering Java ByteCode
PDF
Inside the JVM - Follow the white rabbit!
ZIP
Refatoração + Design Patterns em Ruby
KEY
PHPSpec BDD for PHP
PDF
Коварный code type ITGM #9
PPTX
PDF
ITGM #9 - Коварный CodeType, или от segfault'а к работающему коду
In Vogue Dynamic
Java Bytecode For Discriminating Developers - GeeCON 2011
Advanced Debugging Using Java Bytecodes
Java Bytecode Fundamentals - JUG.lv
Pimp My Java LavaJUG
No dark magic - Byte code engineering in the real world
Inside the JVM - Follow the white rabbit! / Breizh JUG
Ruby: OOP, metaprogramming, blocks, iterators, mix-ins, duck typing. Code style
Java Bytecode for Discriminating Developers - JavaZone 2011
Mastering Java Bytecode - JAX.de 2012
Improving Android Performance at Droidcon UK 2014
How Scala code is expressed in the JVM
Improving Java performance at JBCNConf 2015
Mastering Java ByteCode
Inside the JVM - Follow the white rabbit!
Refatoração + Design Patterns em Ruby
PHPSpec BDD for PHP
Коварный code type ITGM #9
ITGM #9 - Коварный CodeType, или от segfault'а к работающему коду
Ad

More from Joe Kutner (20)

PDF
Fantastic Buildpacks and Where to Find Them
PDF
2019 Texas Star Party
PDF
10 Mistakes Hackers Want You to Make
PDF
NASA Space Apps Expo
PDF
NASA Space Apps
PDF
Why Heroku Loves JHipster
PDF
What the Struts?
PDF
Async and Non-blocking IO w/ JRuby
PDF
I can't believe it's not a queue: Kafka and Spring
PDF
Deploying JHipster Microservices
PPTX
Measuring doubles with 8&quot; neaf copy
PDF
4 JVM Web Frameworks
PDF
JavaOne 2015: 12 Factor App
PDF
12-factor-jruby
PDF
Java 20
PDF
12 Factor Scala
PDF
jdays 2015
PDF
12 Factor App: Best Practices for JVM Deployment
PDF
Creating Scalable JVM/Java Apps on Heroku
PDF
DevLink: Healthy Programmer
Fantastic Buildpacks and Where to Find Them
2019 Texas Star Party
10 Mistakes Hackers Want You to Make
NASA Space Apps Expo
NASA Space Apps
Why Heroku Loves JHipster
What the Struts?
Async and Non-blocking IO w/ JRuby
I can't believe it's not a queue: Kafka and Spring
Deploying JHipster Microservices
Measuring doubles with 8&quot; neaf copy
4 JVM Web Frameworks
JavaOne 2015: 12 Factor App
12-factor-jruby
Java 20
12 Factor Scala
jdays 2015
12 Factor App: Best Practices for JVM Deployment
Creating Scalable JVM/Java Apps on Heroku
DevLink: Healthy Programmer

Recently uploaded (20)

PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PDF
Well-logging-methods_new................
PPTX
Construction Project Organization Group 2.pptx
PPTX
MCN 401 KTU-2019-PPE KITS-MODULE 2.pptx
PPTX
CYBER-CRIMES AND SECURITY A guide to understanding
PPTX
Strings in CPP - Strings in C++ are sequences of characters used to store and...
PPTX
KTU 2019 -S7-MCN 401 MODULE 2-VINAY.pptx
PDF
BMEC211 - INTRODUCTION TO MECHATRONICS-1.pdf
PDF
Digital Logic Computer Design lecture notes
PPTX
web development for engineering and engineering
PPTX
Internet of Things (IOT) - A guide to understanding
PPTX
MET 305 2019 SCHEME MODULE 2 COMPLETE.pptx
PDF
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
PPT
Mechanical Engineering MATERIALS Selection
PPTX
OOP with Java - Java Introduction (Basics)
DOCX
573137875-Attendance-Management-System-original
PPTX
Foundation to blockchain - A guide to Blockchain Tech
PPTX
Lecture Notes Electrical Wiring System Components
PDF
PPT on Performance Review to get promotions
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
Well-logging-methods_new................
Construction Project Organization Group 2.pptx
MCN 401 KTU-2019-PPE KITS-MODULE 2.pptx
CYBER-CRIMES AND SECURITY A guide to understanding
Strings in CPP - Strings in C++ are sequences of characters used to store and...
KTU 2019 -S7-MCN 401 MODULE 2-VINAY.pptx
BMEC211 - INTRODUCTION TO MECHATRONICS-1.pdf
Digital Logic Computer Design lecture notes
web development for engineering and engineering
Internet of Things (IOT) - A guide to understanding
MET 305 2019 SCHEME MODULE 2 COMPLETE.pptx
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
Mechanical Engineering MATERIALS Selection
OOP with Java - Java Introduction (Basics)
573137875-Attendance-Management-System-original
Foundation to blockchain - A guide to Blockchain Tech
Lecture Notes Electrical Wiring System Components
PPT on Performance Review to get promotions
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026

Programming JVM Bytecode

  • 4. $ cat Main.class ????3 <init>()VCodeLineNumberTablemain([Ljava/lang/ String;)V SourceFile Main.java java/util/ArrayListHello Mainjava/lang/Objectadd(Ljava/lang/Object;)Z! *?? *?Y??W?
  • 6. class Main { public static void main(String[] args) { (new ArrayList<String>()).add("Hello"); } }
  • 7. Compiled from "Main.java" public class Main { public Main(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object... 4: return public static void main(java.lang.String[]); Code: 0: new #2 // class java/util/ArrayList 3: dup 4: invokespecial #3 // Method java/util/ArrayList... 7: ldc #4 // String Hello 9: invokevirtual #5 // Method java/util/ArrayList... 12: pop 13: return } $ javac Main.java $ javap -c Main
  • 8. 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 10. [POSITION]: [OPERATION] [OPERAND] Location of the instruction in the raw binary data
  • 11. [POSITION]: [OPERATION] [OPERAND] A mnemonic that represents one of the 256 possible opcodes
  • 12. [POSITION]: [OPERATION] [OPERAND] Arguments to the operation. The number and type of these depends on the operation in use.
  • 13. 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 14. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList $ javap -v -c Main
  • 15. 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 17. Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19) Stack Frame Operand Stack Local Variable Array Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ...
  • 18. Stack Frame Operand StackLocal Vars Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 19. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 20. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList>
  • 21. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList>
  • 22. invokespecial Used to invoke an initializer, private method, or superclass method invokeinterface Used to invoke an interface method invokestatic Used to invoke a class-level method (i.e. static methods) invokevirtual Used to invoke an instance method invokedynamic Used to invoke methods dynamically (new shiny)
  • 23. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList>
  • 24. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList $ javap -v -c Main
  • 25. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList> Stack Frame Operand StackLocal Vars Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ...
  • 26. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 27. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList #18 = Utf8 Hello #19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z $ javap -v -c Main
  • 28. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <“Hello”>
  • 29. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <“Hello”>
  • 30. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList #18 = Utf8 Hello #19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z $ javap -v -c Main
  • 31. java/util/ArrayList.add:(Ljava/lang/Object;)Z B - byte C - char S - short I - int J - long F - float D - double Z - boolean V - void L - object
  • 32. Stack Frame Operand StackLocal Vars Constant Pool ArrayList ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return “Hello”
  • 34. Stack Frame Operand StackLocal Vars Constant Pool ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList> <“Hello”> Stack Frame Operand StackLocal Vars Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... true
  • 35. Stack Frame Operand StackLocal Vars Constant Pool ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return true
  • 36. Stack Frame Operand StackLocal Vars Constant Pool ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 37. swap
  • 38. iadd
  • 42. 000000B0: 73 01 00 0A 4C 43 6F 6D 70 69 6C 65 72 3B 01 00 000000C0: 07 63 6F 6D 70 69 6C 65 01 00 32 28 5B 4C 6A 61 000000D0: 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 000000E0: 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63 72 69 000000F0: 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01 00 06 00000100: 74 6F 6B 65 6E 73 01 00 13 5B 4C 6A 61 76 61 2F 00000110: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 04 6D 00000120: 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 00000130: 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 04 61 00000140: 72 67 73 01 00 09 6A 69 74 65 43 6C 61 73 73 01 00000150: 00 1D 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63 00000160: 72 69 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01 00000170: 00 06 6F 75 74 70 75 74 01 00 1A 4C 6A 61 76 61 00000180: 2F 69 6F 2F 46 69 6C 65 4F 75 74 70 75 74 53 74 00000190: 72 65 61 6D 3B 01 00 0A 45 78 63 65 70 74 69 6F 000001A0: 6E 73 07 00 3A 01 00 0A 53 6F 75 72 63 65 46 69 000001B0: 6C 65 01 00 0A 43 6F 6D 70 69 6C 65 72 2E 6A 61 000001C0: 76 61 0C 00 14 00 15 01 00 0A 43 6F 6D 70 69 6C 000001D0: 65 72 24 31 01 00 04 4D 61 69 6E 0C 00 14 00 3B 000001E0: 01 00 08 43 6F 6D 70 69 6C 65 72 0C 00 1B 00 1C
  • 43. ASM
  • 45. MethodVisitor mv = cv.visitMethod( Opcodes.ACC_PRIVATE, "setupLogger", "(Lorg/apache/maven/cli/MavenCli$CliRequest;)Lorg/codehaus/ plexus/logging/Logger;", null, null); mv.visitCode(); mv.visitTypeInsn( Opcodes.NEW, "com/github/jcgay/maven/color/logger/AnsiColorLogger"); https://github.com/jcgay/maven-color
  • 47. An ECMAScript runtime for the JVM
  • 48. JiteClass ➤ CodeBlock ➤ CodeBlock ➤ CodeBlock Compiled from "Main.java" public class Main { public Main(); Code: 0: aload_0 1: invokespecial #1 4: return public static void main... Code: 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return }
  • 49. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ // ... }}); }};
  • 50. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ new(p(ArrayList.class)); dup(); invokestatic( p(ArrayList.class), ”<init>”, sig(void.class)); ldc(“Hello”) invokevirtual( p(ArrayList.class), “add”, sig(boolean.class, Object.class)); pop(); voidreturn(); }}); }};
  • 51. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ getstatic(p(System.class), "out", ci(PrintStream.class)); ldc(“42"); invokevirtual( p(PrintStream.class), "println", sig(void.class, Object.class)); voidreturn(); }}); }};
  • 52. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ getstatic(p(System.class), "out", ci(PrintStream.class)); ldc(“42"); invokevirtual( p(PrintStream.class), "println", sig(void.class, Object.class)); voidreturn(); }}); }}; 0: getstatic #13 3: ldc #15 5: invokevirtual #21 8: return
  • 54. Brainfu++ > > + + + + + + [ - s + + + + + + + s ] < p
  • 55. p > < : print a variable : push a 0 onto the stack : pop the top value off of the stack + - [ : increment a variable : decrement a variable : start a loop ] : end a loop s : swap the top two values of the stack
  • 56. This is our machine: An empty stack
  • 57. > > + + + + + + [ - s + + + + + + + s ] < p
  • 58. > > + + + + + + [ - s + + + + + + + s ] < p Push two zeros 0 0
  • 59. > > + + + + + + [ - s + + + + + + + s ] < p Inc to 6 0 6
  • 60. > > + + + + + + [ - s + + + + + + + s ] < p Loop 0 6
  • 61. > > + + + + + + [ - s + + + + + + + s ] < p Loop 0 5 Decrement
  • 62. > > + + + + + + [ - s + + + + + + + s ] < p Loop 5 0 Swap
  • 63. > > + + + + + + [ - s + + + + + + + s ] < p Loop 5 7 Increment
  • 64. > > + + + + + + [ - s + + + + + + + s ] < p Loop 7 5 Swap
  • 65. > > + + + + + + [ - s + + + + + + + s ] < p Loop 7 5 End of loop
  • 66. > > + + + + + + [ - s + + + + + + + s ] < p Loop 42 0 Repeat until 0
  • 67. > > + + + + + + [ - s + + + + + + + s ] < p 42 Pop and Print
  • 68. public JiteClass compile(final String program) { return new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ // ... }}); }}; }
  • 69. for (String cmd : program.split(“ “)) { if ("p".equals(cmd)) { } else if ("+".equals(cmd)) { } else if ("-".equals(cmd)) { } else if (">".equals(cmd)) { } else if ("<".equals(cmd)) { } else if ("s".equals(cmd)) { } else if ("[".equals(cmd)) { } else if ("]".equals(cmd)) { } }
  • 71. for (String cmd : program.split(“ “)) { if ("p".equals(cmd)) { } else if ("+".equals(cmd)) { } else if ("-".equals(cmd)) { } else if (">".equals(cmd)) { } else if ("<".equals(cmd)) { } else if ("s".equals(cmd)) { } else if ("[".equals(cmd)) { } else if ("]".equals(cmd)) { } }
  • 72. if ("p".equals(cmd)) { dup(); invokestatic( p(String.class), "valueOf", sig(String.class, int.class)); getstatic(p(System.class), "out", ci(PrintStream.class)); swap(); invokevirtual( p(PrintStream.class), "print", sig(void.class, Object.class)); }
  • 74. else if ("+".equals(cmd)) { iconst_1(); iadd(); }
  • 75. else if (“-".equals(cmd)) { iconst_1(); isub(); }
  • 76. else if (“>".equals(cmd)) { iconst_0(); }
  • 79. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 80. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 81. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 82. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 83. else if (“]“.equals(cmd)) { LabelNode[] labelNodes = loopStack.pop(); LabelNode begin = labelNodes[0]; LabelNode end = labelNodes[1]; go_to(begin); label(end); }
  • 84. 14: dup 15: ifeq 39 ... 36: goto 14 39: pop
  • 85. $ java Compiler “< < + + +” $ java Main 42
  • 86. public class BrainCodeBlock extends CodeBlock { public void brainPrint(String s) { /* ... */ } public void brainPush(BrainObject o) { /* ... */ } public BrainObject brainPop() { /* ... */ } public void brainLoop(Predicate<CodeBlock> b) { // ... } }
  • 89. ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.get("test.Rectangle"); cc.setSuperclass(pool.get("test.Point")); cc.writeFile();
  • 90. class ThirdParty { public void run() { fetchData(); processData(); invokeService(); resolveConflicts(); finalize(); } }
  • 91. ClassPool cp = ClassPool.getDefault(); CtClass cc = cp.get(“ThirdParty"); CtMethod m = cc.getDeclaredMethod(“fetchData"); m.addLocalVariable("t", CtClass.longType); m.insertBefore( "t = System.currentTimeMillis();"); m.insertAfter( “{“ + “ t = System.currentTimeMillis() - t;” + “ System.out.println("Time (ms): " + t);” + ”}"); byte[] byteCode = cc.toBytecode(); cc.detach(); http://www.tomsquest.com/blog/2014/01/intro-java-agent-and-bytecode-manipulation/
  • 92. calling ThirdParty fetching data... Time (ms): 55 processing data... Time (ms): 6032
  • 94. No, make a new JVM Language
  • 95. (print (* 7 5))
  • 98. Brainfu** (Jipsy) List of JVM Bytecode Operations http://github.com/jkutner/jipsy http://docs.oracle.com/javase/specs/jvms/se8/html/ Jitescript https://github.com/qmx/jitescript
  • 99. The next time you compile… Run javap against the class file.