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
0: new #2
[POSITION]: [OPERATION] [OPERAND]
A mnemonic that represents one of
the 256 possible opcodes
0: new #2
[POSITION]: [OPERATION] [OPERAND]
Arguments to the operation.
The number and type of these
depends on the operation in use.
0: new #2
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
Why Read Bytecode?
• Diagnose performance problems
• Reverse engineering
• Security audit
• Debug legacy code
• FindBugs plugins that work across languages
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
http://asm.ow2.org/
Programming JVM Bytecode with Jitescript
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
https://github.com/qmx/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 with Jitescript
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 “< < + + +”
Generated Main.class
$ java Main
42
Byteman
http://byteman.jboss.org/
Javassist
http://www.javassist.org/
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
Improve performance
Improve performance
Obfuscate code
Obfuscate code
Make a DSL…
No, make a new
JVM Language
(do 10 (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
ASM Bytecode Outline
ProGuard
https://plugins.jetbrains.com/plugin/5918
http://proguard.sourceforge.net/
Dr. Garbage
http://www.drgarbage.com/
The next time you compile…
Run javap against the class file.
Thank You
Joe Kutner
@codefinger
http://www.slideshare.net/jkutner/programming-jvm-bytecode

More Related Content

PDF
Programming JVM Bytecode
PDF
Java Generics - by Example
PDF
Practical JavaScript Programming - Session 6/8
PDF
Hidden Gems of Ruby 1.9
KEY
SPL, not a bridge too far
PDF
Publishing a Perl6 Module
KEY
Zen: Building Maintainable Catalyst Applications
PDF
Perl Sucks - and what to do about it
Programming JVM Bytecode
Java Generics - by Example
Practical JavaScript Programming - Session 6/8
Hidden Gems of Ruby 1.9
SPL, not a bridge too far
Publishing a Perl6 Module
Zen: Building Maintainable Catalyst Applications
Perl Sucks - and what to do about it

What's hot (20)

PPTX
Java Bytecode: Passing Parameters
PDF
Better detection of what modules are used by some Perl 5 code
PDF
Thoughts On Learning A New Programming Language
PDF
The Ring programming language version 1.8 book - Part 96 of 202
PPT
2016年のPerl (Long version)
PDF
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
PPTX
JavaScript Proven Practises
PDF
Melhorando sua API com DSLs
PDF
Short Introduction To "perl -d"
ODP
Scala 2 + 2 > 4
PDF
Riga Dev Day 2016 - Having fun with Javassist
PPTX
Jdk 7 4-forkjoin
PDF
Java Class Design
PDF
Metadata-driven Testing
PDF
Keeping objects healthy with Object::Exercise.
PDF
Bee Smalltalk RunTime: anchor's aweigh
PDF
Perl 5.28 new features
PDF
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
PDF
The $path to knowledge: What little it take to unit-test Perl.
PDF
Managing Mocks
Java Bytecode: Passing Parameters
Better detection of what modules are used by some Perl 5 code
Thoughts On Learning A New Programming Language
The Ring programming language version 1.8 book - Part 96 of 202
2016年のPerl (Long version)
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
JavaScript Proven Practises
Melhorando sua API com DSLs
Short Introduction To "perl -d"
Scala 2 + 2 > 4
Riga Dev Day 2016 - Having fun with Javassist
Jdk 7 4-forkjoin
Java Class Design
Metadata-driven Testing
Keeping objects healthy with Object::Exercise.
Bee Smalltalk RunTime: anchor's aweigh
Perl 5.28 new features
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
The $path to knowledge: What little it take to unit-test Perl.
Managing Mocks
Ad

Similar to Programming JVM Bytecode with Jitescript (20)

PDF
Advanced Debugging Using Java Bytecodes
PPTX
Java Bytecode For Discriminating Developers - GeeCON 2011
PDF
In Vogue Dynamic
PDF
No dark magic - Byte code engineering in the real world
PPT
Ruby: OOP, metaprogramming, blocks, iterators, mix-ins, duck typing. Code style
PPTX
Java Bytecode Fundamentals - JUG.lv
PDF
Java Bytecode for Discriminating Developers - JavaZone 2011
PPTX
Mastering Java Bytecode - JAX.de 2012
PDF
Inside the JVM - Follow the white rabbit! / Breizh JUG
PDF
Improving Android Performance at Droidcon UK 2014
ZIP
Refatoração + Design Patterns em Ruby
PDF
Pimp My Java LavaJUG
PPT
Mastering Java ByteCode
PDF
How Scala code is expressed in the JVM
PDF
Improving Java performance at JBCNConf 2015
PDF
Message in a bottle
PDF
Inside the JVM - Follow the white rabbit!
KEY
PHPSpec BDD for PHP
PPT
Scala uma poderosa linguagem para a jvm
KEY
10 Catalyst Tips
Advanced Debugging Using Java Bytecodes
Java Bytecode For Discriminating Developers - GeeCON 2011
In Vogue Dynamic
No dark magic - Byte code engineering in the real world
Ruby: OOP, metaprogramming, blocks, iterators, mix-ins, duck typing. Code style
Java Bytecode Fundamentals - JUG.lv
Java Bytecode for Discriminating Developers - JavaZone 2011
Mastering Java Bytecode - JAX.de 2012
Inside the JVM - Follow the white rabbit! / Breizh JUG
Improving Android Performance at Droidcon UK 2014
Refatoração + Design Patterns em Ruby
Pimp My Java LavaJUG
Mastering Java ByteCode
How Scala code is expressed in the JVM
Improving Java performance at JBCNConf 2015
Message in a bottle
Inside the JVM - Follow the white rabbit!
PHPSpec BDD for PHP
Scala uma poderosa linguagem para a jvm
10 Catalyst Tips
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)

PPT
Mechanical Engineering MATERIALS Selection
PPTX
CH1 Production IntroductoryConcepts.pptx
PPTX
Strings in CPP - Strings in C++ are sequences of characters used to store and...
PDF
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
PDF
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PPTX
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
PPTX
web development for engineering and engineering
PPTX
UNIT 4 Total Quality Management .pptx
PPT
Project quality management in manufacturing
PPTX
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
PDF
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
PDF
Embodied AI: Ushering in the Next Era of Intelligent Systems
DOCX
ASol_English-Language-Literature-Set-1-27-02-2023-converted.docx
PPTX
Welding lecture in detail for understanding
PPTX
Geodesy 1.pptx...............................................
PDF
Well-logging-methods_new................
PPTX
FINAL REVIEW FOR COPD DIANOSIS FOR PULMONARY DISEASE.pptx
PDF
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
PDF
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
Mechanical Engineering MATERIALS Selection
CH1 Production IntroductoryConcepts.pptx
Strings in CPP - Strings in C++ are sequences of characters used to store and...
Mohammad Mahdi Farshadian CV - Prospective PhD Student 2026
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
web development for engineering and engineering
UNIT 4 Total Quality Management .pptx
Project quality management in manufacturing
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
Embodied AI: Ushering in the Next Era of Intelligent Systems
ASol_English-Language-Literature-Set-1-27-02-2023-converted.docx
Welding lecture in detail for understanding
Geodesy 1.pptx...............................................
Well-logging-methods_new................
FINAL REVIEW FOR COPD DIANOSIS FOR PULMONARY DISEASE.pptx
SM_6th-Sem__Cse_Internet-of-Things.pdf IOT
Mitigating Risks through Effective Management for Enhancing Organizational Pe...

Programming JVM Bytecode with Jitescript

  • 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 0: new #2
  • 11. [POSITION]: [OPERATION] [OPERAND] A mnemonic that represents one of the 256 possible opcodes 0: new #2
  • 12. [POSITION]: [OPERATION] [OPERAND] Arguments to the operation. The number and type of these depends on the operation in use. 0: new #2
  • 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
  • 41. Why Read Bytecode? • Diagnose performance problems • Reverse engineering • Security audit • Debug legacy code • FindBugs plugins that work across languages
  • 43. 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
  • 46. 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
  • 48. An ECMAScript runtime for the JVM
  • 49. 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 }
  • 50. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ // ... }}); }};
  • 51. 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(); }}); }};
  • 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(); }}); }};
  • 53. 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
  • 55. Brainfu++ > > + + + + + + [ - s + + + + + + + s ] < p
  • 56. 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
  • 57. This is our machine: An empty stack
  • 58. > > + + + + + + [ - s + + + + + + + s ] < p
  • 59. > > + + + + + + [ - s + + + + + + + s ] < p Push two zeros 0 0
  • 60. > > + + + + + + [ - s + + + + + + + s ] < p Inc to 6 0 6
  • 61. > > + + + + + + [ - s + + + + + + + s ] < p Loop 0 6
  • 62. > > + + + + + + [ - s + + + + + + + s ] < p Loop 0 5 Decrement
  • 63. > > + + + + + + [ - s + + + + + + + s ] < p Loop 5 0 Swap
  • 64. > > + + + + + + [ - s + + + + + + + s ] < p Loop 5 7 Increment
  • 65. > > + + + + + + [ - s + + + + + + + s ] < p Loop 7 5 Swap
  • 66. > > + + + + + + [ - s + + + + + + + s ] < p Loop 7 5 End of loop
  • 67. > > + + + + + + [ - s + + + + + + + s ] < p Loop 42 0 Repeat until 0
  • 68. > > + + + + + + [ - s + + + + + + + s ] < p 42 Pop and Print
  • 69. public JiteClass compile(final String program) { return new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ // ... }}); }}; }
  • 70. 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. 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)) { } }
  • 73. 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)); }
  • 75. else if ("+".equals(cmd)) { iconst_1(); iadd(); }
  • 76. else if (“-".equals(cmd)) { iconst_1(); isub(); }
  • 77. else if (“>".equals(cmd)) { iconst_0(); }
  • 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. 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}); }
  • 84. else if (“]“.equals(cmd)) { LabelNode[] labelNodes = loopStack.pop(); LabelNode begin = labelNodes[0]; LabelNode end = labelNodes[1]; go_to(begin); label(end); }
  • 85. 14: dup 15: ifeq 39 ... 36: goto 14 39: pop
  • 86. $ java Compiler “< < + + +” Generated Main.class $ java Main 42
  • 89. class ThirdParty { public void run() { fetchData(); processData(); invokeService(); resolveConflicts(); finalize(); } }
  • 90. 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/
  • 91. calling ThirdParty fetching data... Time (ms): 55 processing data... Time (ms): 6032
  • 97. No, make a new JVM Language
  • 98. (do 10 (print (* 7 5)))
  • 101. 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
  • 103. The next time you compile… Run javap against the class file.