SlideShare uma empresa Scribd logo
1 de 79
Baixar para ler offline
Pimp my Java
Daniel Petisme
Philippe Charrière
Us?
@k33g_org
aka. Golo Developer Advocate
@danielpetisme
invokedynamic?
Java VM
Java VM
Multi-Language VM
The Java SE 7 platform enables non-Java languages
to exploit the infrastructure and potential performance
optimizations of the JVM.
The key mechanism is the invokedynamic
instruction, which simplifies the implementation of
compilers and runtime systems for dynamically typed
languages on the JVM.
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html
Static

public class Adder {

public Integer add(Integer a, Integer b ) {
return a + b;
}
public String add(String a, String b ) {
return a + b;
}
public static void main(String[] args) {
Adder myAdder = new Adder();
int x = 10;
int y = 10;
List<String> jugs = new ArrayList<>();
String theBestOne = "LavaJUG";
jugs.add(theBestOne);
myAdder.add(x, y);
myAdder.add( "The Best JUG is: ",theBestOne);
}
}

Types checking at compilation...
Dynamic
class Adder {
def add(a, b) {
return a + b
}
def main(args) {
def myAdder = new Adder()
def x = 10
def y = 10
def jugs = []
def theBestOne = "LavaJUG";
jugs.add(theBestOne)
myAdder.add(x, y)
myAdder.add( "The Best JUG is: ",
theBestOne)
}
}

Types checking at runtime...
And what’s the
problem?
Dynamic language compilation
public class Adder {
public Integer add(Integer a, Integer b ) {
return a + b;
}
public String add(String a, String b ) {
return a + b;
}
public static void main(String[] args) {
Adder myAdder = new Adder();
int x = 10;
int y = 10;
List<String> jugs = new ArrayList<>();
String theBestOne = "LavaJUG";
jugs.add(theBestOne);
myAdder.add(x, y);
myAdder.add( "The Best JUG is: ",theBestOne);
}
}
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=6, args_size=1
0: new
#8
// class lavajug/sample1/Adder
3: dup
4: invokespecial #9
// Method"<init>":()V
7: astore_1
8: bipush
10
10: istore_2
11: bipush
10
13: istore_3
14: new
#10
// class java/util/ArrayList
17: dup
18: invokespecial #11
// Methodjava/util/ArrayList."<init>":()V
21: astore
4
23: ldc
#12
// String LavaJUG
25: astore
5
27: aload
4
29: aload
5
31: invokeinterface #13, 2
// InterfaceMethod
java/util/List.add:(Ljava/lang/Object;)Z
36: pop
37: aload_1
38: iload_2
39: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
42: iload_3
43: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
46: invokevirtual #14
// Methodadd:(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
49: pop
50: aload_1
51: ldc
#15
// String The Best JUG is:
53: aload
5
55: invokevirtual #16
// Methodadd:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
58: pop
59: return
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=6, args_size=1
0: new
#8
// class lavajug/sample1/Adder
3: dup
4: invokespecial #9
// Method"<init>":()V
7: astore_1
8: bipush
10
10: istore_2
11: bipush
10
13: istore_3
14: new
#10
// class java/util/ArrayList
17: dup
18: invokespecial #11
// Methodjava/util/ArrayList."<init>":()V
21: astore
4
23: ldc
#12
// String LavaJUG
25: astore
5
27: aload
4
29: aload
5
31: invokeinterface #13, 2
// InterfaceMethod
java/util/List.add:(Ljava/lang/Object;)Z
36: pop
37: aload_1
38: iload_2
39: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
42: iload_3
43: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
46: invokevirtual #14
// Methodadd:(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
49: pop
50: aload_1
51: ldc
#15
// String The Best JUG is:
53: aload
5
55: invokevirtual #16
// Methodadd:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
58: pop
59: return

1- Types present at the callsites
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=6, args_size=1
0: new
#8
// class lavajug/sample1/Adder
3: dup
4: invokespecial #9
// Method"<init>":()V
7: astore_1
8: bipush
10
10: istore_2
11: bipush
10
13: istore_3
14: new
#10
// class java/util/ArrayList
17: dup
18: invokespecial #11
// Methodjava/util/ArrayList."<init>":()V
21: astore
4
23: ldc
#12
// String LavaJUG
25: astore
5
27: aload
4
29: aload
5
31: invokeinterface #13, 2
// InterfaceMethod
java/util/List.add:(Ljava/lang/Object;)Z
36: pop
37: aload_1
38: iload_2
39: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
42: iload_3
43: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
46: invokevirtual #14
// Methodadd:(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
49: pop
50: aload_1
51: ldc
#15
// String The Best JUG is:
53: aload
5
55: invokevirtual #16
// Methodadd:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
58: pop
59: return

1- Types present at the callsites

2- Method must exist at compile time
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=6, args_size=1
0: new
#8
// class lavajug/sample1/Adder
3: dup
4: invokespecial #9
// Method"<init>":()V
7: astore_1
8: bipush
10
10: istore_2
11: bipush
10
13: istore_3
14: new
#10
// class java/util/ArrayList
17: dup
18: invokespecial #11
// Methodjava/util/ArrayList."<init>":()V
21: astore
4
23: ldc
#12
// String LavaJUG
25: astore
5
27: aload
4
29: aload
5
31: invokeinterface #13, 2
// InterfaceMethod
java/util/List.add:(Ljava/lang/Object;)Z
36: pop
37: aload_1
38: iload_2
39: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
42: iload_3
43: invokestatic #3
// Methodjava/lang/Integer.valueOf:(I)Ljava/lang/Integer;
46: invokevirtual #14
// Methodadd:(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
49: pop
50: aload_1
51: ldc
#15
// String The Best JUG is:
53: aload
5
55: invokevirtual #16
// Methodadd:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
58: pop
59: return

1- Types present at the callsites

2- Method must exist at compile time

3- No relinking possible
How to invoke
invokeStatic
Integer.valueOf(10);
invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

invokeSpecial
new ArrayList();
invokespecial #11 // Method java/util/ArrayList."<init>":()V

invokeInterface
jugs.add(theBestOne);
invokeinterface #13,

2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z

invokeVirtual
myAdder.add("The Best JUG is: ",theBestOne);
invokevirtual #16 // Method lavajug/sample1/java/Adder.add:(Ljava/lang/String;
Ljava/lang/String;)Ljava/lang/String;
CallSite

Receiver

ReceiverClass

Name

Descriptor

myAdder

Adder

add

(Ljava/lang/String;Ljava/lang/String;)
Ljava/lang/String;

CallSite
CallSite

Receiver

ReceiverClass

Name

Descriptor

myAdder

Adder

add

(Ljava/lang/String;Ljava/lang/String;)
Ljava/lang/String;

CallSite

myAdder.add("The Best JUG is: ",
theBestOne)

JVM
CallSite

Receiver

ReceiverClass

Name

Descriptor

myAdder

Adder

add

(Ljava/lang/String;Ljava/lang/String;)
Ljava/lang/String;

CallSite

myAdder.add("The Best JUG is: ",
theBestOne)

JVM

myAdder

Adder
instance of

1- Is Receiver an instance of ReceiverClass?
CallSite

Receiver

ReceiverClass

Name

Descriptor

myAdder

Adder

add

(Ljava/lang/String;Ljava/lang/String;)
Ljava/lang/String;

CallSite

myAdder.add("The Best JUG is: ",
theBestOne)

JVM
2- Does a method called Name
whose descriptor is Descriptor
exist?

myAdder

Adder
instance of

1- Is Receiver an instance of ReceiverClass?
CallSite

Receiver

ReceiverClass

Name

Descriptor

myAdder

Adder

add

(Ljava/lang/String;Ljava/lang/String;)
Ljava/lang/String;

String add(String,
String)

CallSite

myAdder.add("The Best JUG is: ",
theBestOne)

JVM
2- Does a method called Name
whose descriptor is Descriptor
exist?

myAdder

Adder
instance of

1- Is Receiver an instance of ReceiverClass?
CallSite

Receiver

ReceiverClass

Name

Descriptor

myAdder

Adder

add

(Ljava/lang/String;Ljava/lang/String;)
Ljava/lang/String;

String add(String,
String)

CallSite
3- branch
myAdder.add("The Best JUG is: ",
theBestOne)

JVM
2- Does a method called Name
whose descriptor is Descriptor
exist?

myAdder

Adder
instance of

1- Is Receiver an instance of ReceiverClass?
Dynamic languages
invokedynamic!
JSR-292: Da Vinci Machine

New bytecode: invokedynamic
A new
invokedynamic
bytecode, that’s
all?
invokedynamic
Use symbolic specifications at compilation
Defer callsite bindings to runtime
invoke dynamic
user-defined
bytecode

method linking
& adaptation

Bonus: JVM Optimizations
New!
java.lang.invoke
Chapter I
Method Handles
Method Handles?
Method Handles

≈

int (*functionPtr)(int,int);
MethodHandle Factory embeds method handle access restrictions

String word = "Java";
MethodHandles.Lookup lookup = MethodHandles.lookup();
Class receiverType = String.
class;
Class returnType = char.class;
Class paramType = int.class;

Seek for a public exposed Method

MethodHandle charAtHandle = lookup.
findVirtual(
receiverType,
Where to look
What we
for the Method
"charAt",
are looking
MethodType.methodType(returnType, paramType)
for
);

Descriptor

char charAt0 = (char) charAtHandle.invokeWithArguments(word, 0);
assert charAt0 == 'J';
Invocation with the receiver instance and the parameter(s)
Method Handles
Vs.
Reflection?
Method Handles
Vs.
Reflection?
Better/Easier discovery mechanism
Faster + Combination facilities

Method Handles
Vs.
Reflection?
Better/Easier discovery mechanism
Method Handles
&
Reflection!
Lookup lookup = MethodHandles.lookup();
Method formatMethod = MessageFormat.
class.getMethod(
"format",
String.class,
Object[].class
);
MethodHandle greeterHandle = lookup
.unreflect(formatMethod);
assert greeterHandle.type() == methodType(
String.class,
String.class,
Object[].class
From java.lang.reflect to java.lang.invoke
);
Looks fun?
You ain’t see nothing!
Lookup lookup = MethodHandles.lookup();
Method formatMethod = MessageFormat. class.getMethod(
"format", String.class, Object[]. class );

MethodHandle greeterHandle = lookup. unreflect(formatMethod);
greeterHandle = greeterHandle.
bindTo("Hello {0} {1}{2}").
asCollector(Object[]. class, 3);

Curry power ❤

Now representing a 3 args method
//Arguments manipulation
greeterHandle = MethodHandles. insertArguments(
greeterHandle,
greeterHandle.type().parameterCount() - 1, Add/remove/move arguments
"!"
);
//Combining
Method toUpperMethod = String. class.getMethod( "toUpperCase");
MethodHandle toUpperHandle = lookup.unreflect(toUpperMethod);
greeterHandle = MethodHandles. filterReturnValue(greeterHandle,
toUpperHandle);
Split the concerns, then combine the
methods
//Test
String greet = (String) greeterHandle.invokeWithArguments( "John", "Doe");
assert greet.equals( "HELLO JOHN DOE!");
Test

mh.invoke(...);

GuardWithTest

Target

Fallback
Get prepared for λ...
Chapter II
BootStrapping
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

At compilation: Method pointers

ActualImplementationClass

actualMethod(actualType)
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

How to??

ActualImplementationClass

actualMethod(actualType)
Delegation to a
BootStrap Method
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

Each InvokeDynamic instruction refers to a
BootStrap Method invoked the 1st time

BootStrap Method (BSM)

ActualImplementationClass

actualMethod(actualType)
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

BootStrap Method (BSM)

lookup

ActualImplementationClass

actualMethod(actualType)
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

BootStrap Method (BSM)

MethodHandle(s)

Compute the MH
representing the
target

ActualImplementationClass

actualMethod(actualType)
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

CallSite
BootStrap Method (BSM)

MethodHandle(s)

Wrap the MH
representation in a
CallSite and return it

ActualImplementationClass

actualMethod(actualType)
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType
invoke the
CallSite

CallSite
BootStrap Method (BSM)

MethodHandle(s)

ActualImplementationClass

actualMethod(actualType)
DynamicInvokerClass
invokeDynamic symMethodName:
symMethodType

CallSite
BootStrap Method (BSM)

MethodHandle(s)

Invoke the actual
target

ActualImplementationClass

actualMethod(actualType)
BootStrap Method needs?
BootStrap Method needs:
The invocation context (MethodHandles.Lookup)
A symbolic name (String)
The resolved type descriptor of the call (MethodType)

Optional arguments (constants)
public static CallSite bootstrap(Lookup lookup, String name, MethodType
type)
throws Throwable {
MethodHandle target = lookup.findStatic(MessageFormat. class, "format",
methodType(String. class, String.class, Object[]. class))
.bindTo( "Hello {0} {1}!")
.asCollector(String[]. class, 2)
The target representation
.asType(type);
return new ConstantCallSite(target);
}

The binding between invoker & receiver
at runtime

public static void main(String[] args) throws Throwable{
CallSite callSite = bootstrap(
MethodHandles.lookup(),
"myGreeter",
methodType(String. class, String.class, String.class)
);
String greet = (String) callSite.dynamicInvoker().invokeWithArguments(
"John", "Doe"
);
assert greet.equals( "Hello John Doe!");
}
<<abstract>>

CallSite

ConstantCallSite

MutableCallSite

VolatileCallSite
Chapter III
Bytecode strikes
back
How to produce
invokeDynamic
bytecode ops?
You can’t!
You can’t!
at the moment...
http://asm.ow2.org/
All together: YAAL
YAAL = Yet Another Awesome Language
= Makes me rich
= Makes me famous
= Useful
= Kind of invokedynamic how to
Demo time!
https://github.com/danielpetisme/pimp-my-java
greet John Doe

Yaal Syntax
An operation

greet John Doe

Yaal Syntax
An operation

greet John Doe

N arguments

Yaal Syntax
Yaal Symbols

YaalParser
YaalNode

Parsing
Java in-memory
Yaal model

Compilation
Java bytecode

YaalClassLoader
YaalFunctionSupport

Runtime

YaalCompiler
ASM
MethodVisitor mv = writer.visitMethod(
ACC_STATIC | ACC_PUBLIC, "main", "([Ljava/lang/String;)V", null,
null);
Creating a main
String bootstrapOwner = "lavajug/yaal/runtime/YaalFunctionSupport";
String bootstrapMethod = "bootstrap";
String desc = MethodType.methodType(
CallSite. class,
MethodHandles.Lookup. class,
String.class,
MethodType. class).toMethodDescriptorString();
Handle bsm = new Handle(
H_INVOKESTATIC,
bootstrapOwner,
bootstrapMethod,
desc
);

BSM definition

push args on the
stack

for (YaalNode node : nodes) {
for(String argument : node.arguments) {
mv.visitLdcInsn(argument);
}
Creating an invokedynamic
instruction
mv.visitInvokeDynamicInsn(
node.operator,
genericMethodType(node.arguments.length).toMethodDescriptorString(),
bsm
);
}
...

YaalCompiler#compile
public class YaalFunctionSupport {
public static CallSite bootstrap(
MethodHandles.Lookup lookup, String name, MethodType type
) throws NoSuchMethodException, IllegalAccessException {
Method predefinedMethod = findMethodByName(Predefined.class, name);
MethodHandle target = lookup.unreflect(predefinedMethod).asType
(type);
return new ConstantCallSite(target);
}
…
}

unreflect a method from Yaal
Predefined functions
To take away
< Java 1.7 Type checking at compilation.
Hardcoded callsites with types

Java 1.7

invoke dynamic
user-defined bytecode
Bytecode (ASM) +
BootStrap

method linking & adaptation
MethodHandle

Use symbolic specifications at compilation
Defer callsite bindings to runtime
One more thing...
Thanks @jponge
Demystifying
invokedynamic
Part I
http://www.oraclejavamagazine-digital.com/javamagazine/20130102?pg=50#pg50

Part II
http://www.oraclejavamagazine-digital.com/javamagazine/20130506?pg=42#pg42
Golo for newbies!
-> @k33g_org
https://github.com/k33g/golotour/tree/master/04-Golo.63.LavaJUG
You have

Questions
We may have

Answers

Mais conteúdo relacionado

Mais procurados

EPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEnterprise PHP Center
 
PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to heroJeremy Cook
 
Voxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistVoxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistAnton Arhipov
 
Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Daniele Pallastrelli
 
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)ENDelt260
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialJustin Lin
 
Mastering Namespaces in PHP
Mastering Namespaces in PHPMastering Namespaces in PHP
Mastering Namespaces in PHPNick Belhomme
 
New Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian BergmannNew Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian Bergmanndpc
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsAnton Arhipov
 
Puppet modules: An Holistic Approach
Puppet modules: An Holistic ApproachPuppet modules: An Holistic Approach
Puppet modules: An Holistic ApproachAlessandro Franceschi
 
Debugging of (C)Python applications
Debugging of (C)Python applicationsDebugging of (C)Python applications
Debugging of (C)Python applicationsRoman Podoliaka
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applicationschartjes
 
Java Platform Module System
Java Platform Module SystemJava Platform Module System
Java Platform Module SystemVignesh Ramesh
 
Invokedynamic / JSR-292
Invokedynamic / JSR-292Invokedynamic / JSR-292
Invokedynamic / JSR-292ytoshima
 

Mais procurados (20)

EPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur PurnamaEPHPC Webinar Slides: Unit Testing by Arthur Purnama
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
 
PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to hero
 
Voxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistVoxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with Javassist
 
What`s new in Java 7
What`s new in Java 7What`s new in Java 7
What`s new in Java 7
 
Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++
 
C tutorial
C tutorialC tutorial
C tutorial
 
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)Unlock The Mystery Of PHPUnit (Wave PHP 2018)
Unlock The Mystery Of PHPUnit (Wave PHP 2018)
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 Tutorial
 
Mastering Namespaces in PHP
Mastering Namespaces in PHPMastering Namespaces in PHP
Mastering Namespaces in PHP
 
Php Debugger
Php DebuggerPhp Debugger
Php Debugger
 
New Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian BergmannNew Features PHPUnit 3.3 - Sebastian Bergmann
New Features PHPUnit 3.3 - Sebastian Bergmann
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java Agents
 
JavaFXScript
JavaFXScriptJavaFXScript
JavaFXScript
 
Puppet modules: An Holistic Approach
Puppet modules: An Holistic ApproachPuppet modules: An Holistic Approach
Puppet modules: An Holistic Approach
 
Debugging of (C)Python applications
Debugging of (C)Python applicationsDebugging of (C)Python applications
Debugging of (C)Python applications
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
Deep C
Deep CDeep C
Deep C
 
Java Platform Module System
Java Platform Module SystemJava Platform Module System
Java Platform Module System
 
Invokedynamic / JSR-292
Invokedynamic / JSR-292Invokedynamic / JSR-292
Invokedynamic / JSR-292
 
What's New in Groovy 1.6?
What's New in Groovy 1.6?What's New in Groovy 1.6?
What's New in Groovy 1.6?
 

Semelhante a Pimp my Java with invokedynamic

Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGSylvain Wallez
 
모던자바의 역습
모던자바의 역습모던자바의 역습
모던자바의 역습DoHyun Jung
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Sylvain Wallez
 
JavaFX8 TestFX - CDI
JavaFX8   TestFX - CDIJavaFX8   TestFX - CDI
JavaFX8 TestFX - CDISven Ruppert
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Anton Arhipov
 
Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012Anton Arhipov
 
Introduction to computer science
Introduction to computer scienceIntroduction to computer science
Introduction to computer scienceumardanjumamaiwada
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014Raimon Ràfols
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to javaciklum_ods
 
From Java 6 to Java 7 reference
From Java 6 to Java 7 referenceFrom Java 6 to Java 7 reference
From Java 6 to Java 7 referenceGiacomo Veneri
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agentsRafael Winterhalter
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest UpdatesIftekhar Eather
 
Java 9 features
Java 9 featuresJava 9 features
Java 9 featuresshrinath97
 
core java material.pdf
core java material.pdfcore java material.pdf
core java material.pdfRasa72
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM BytecodeJoe Kutner
 

Semelhante a Pimp my Java with invokedynamic (20)

Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUG
 
모던자바의 역습
모던자바의 역습모던자바의 역습
모던자바의 역습
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
 
JavaFX8 TestFX - CDI
JavaFX8   TestFX - CDIJavaFX8   TestFX - CDI
JavaFX8 TestFX - CDI
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011
 
Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012
 
In Vogue Dynamic
In Vogue DynamicIn Vogue Dynamic
In Vogue Dynamic
 
lecture 6
 lecture 6 lecture 6
lecture 6
 
Introduction to computer science
Introduction to computer scienceIntroduction to computer science
Introduction to computer science
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 
From Java 6 to Java 7 reference
From Java 6 to Java 7 referenceFrom Java 6 to Java 7 reference
From Java 6 to Java 7 reference
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agents
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
 
Java 9 features
Java 9 featuresJava 9 features
Java 9 features
 
Java lab-manual
Java lab-manualJava lab-manual
Java lab-manual
 
core java material.pdf
core java material.pdfcore java material.pdf
core java material.pdf
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM Bytecode
 
Groovy!
Groovy!Groovy!
Groovy!
 

Mais de Daniel Petisme

20190627 j hipster-conf- diary of a java dev lost in the .net world
20190627   j hipster-conf- diary of a java dev lost in the .net world20190627   j hipster-conf- diary of a java dev lost in the .net world
20190627 j hipster-conf- diary of a java dev lost in the .net worldDaniel Petisme
 
Diary of a Java dev lost in the .Net world - LyonJug + LyonMug
Diary of a Java dev lost in the .Net world - LyonJug + LyonMugDiary of a Java dev lost in the .Net world - LyonJug + LyonMug
Diary of a Java dev lost in the .Net world - LyonJug + LyonMugDaniel Petisme
 
Diary of a Java dev lost in the .Net world - MugInClermont
Diary of a Java dev lost in the .Net world - MugInClermont Diary of a Java dev lost in the .Net world - MugInClermont
Diary of a Java dev lost in the .Net world - MugInClermont Daniel Petisme
 
Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)
Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)
Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)Daniel Petisme
 
Say microservices again! (Clermont'ech 01/03/2016)
Say microservices again! (Clermont'ech 01/03/2016)Say microservices again! (Clermont'ech 01/03/2016)
Say microservices again! (Clermont'ech 01/03/2016)Daniel Petisme
 
How I met DevOps Agile Tour Clermont-Ferrand 2013
How I met DevOps Agile Tour Clermont-Ferrand 2013How I met DevOps Agile Tour Clermont-Ferrand 2013
How I met DevOps Agile Tour Clermont-Ferrand 2013Daniel Petisme
 
How I met DevOps Clermont'ech #APIHour 4
How I met DevOps Clermont'ech #APIHour 4 How I met DevOps Clermont'ech #APIHour 4
How I met DevOps Clermont'ech #APIHour 4 Daniel Petisme
 

Mais de Daniel Petisme (7)

20190627 j hipster-conf- diary of a java dev lost in the .net world
20190627   j hipster-conf- diary of a java dev lost in the .net world20190627   j hipster-conf- diary of a java dev lost in the .net world
20190627 j hipster-conf- diary of a java dev lost in the .net world
 
Diary of a Java dev lost in the .Net world - LyonJug + LyonMug
Diary of a Java dev lost in the .Net world - LyonJug + LyonMugDiary of a Java dev lost in the .Net world - LyonJug + LyonMug
Diary of a Java dev lost in the .Net world - LyonJug + LyonMug
 
Diary of a Java dev lost in the .Net world - MugInClermont
Diary of a Java dev lost in the .Net world - MugInClermont Diary of a Java dev lost in the .Net world - MugInClermont
Diary of a Java dev lost in the .Net world - MugInClermont
 
Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)
Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)
Construire un Fitbit-like pour chiens et chats (Devoxx France 21/04/2016)
 
Say microservices again! (Clermont'ech 01/03/2016)
Say microservices again! (Clermont'ech 01/03/2016)Say microservices again! (Clermont'ech 01/03/2016)
Say microservices again! (Clermont'ech 01/03/2016)
 
How I met DevOps Agile Tour Clermont-Ferrand 2013
How I met DevOps Agile Tour Clermont-Ferrand 2013How I met DevOps Agile Tour Clermont-Ferrand 2013
How I met DevOps Agile Tour Clermont-Ferrand 2013
 
How I met DevOps Clermont'ech #APIHour 4
How I met DevOps Clermont'ech #APIHour 4 How I met DevOps Clermont'ech #APIHour 4
How I met DevOps Clermont'ech #APIHour 4
 

Último

Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 

Último (20)

Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 

Pimp my Java with invokedynamic