SlideShare une entreprise Scribd logo
1  sur  79
Télécharger pour lire hors ligne
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);
}
}
Pimp My Java LavaJUG
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
Pimp My Java LavaJUG
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

Contenu connexe

Tendances

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
 

Tendances (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?
 

Similaire à Pimp My Java LavaJUG

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
 

Similaire à Pimp My Java LavaJUG (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!
 

Plus 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
 

Plus 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
 

Dernier

AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxUdaiappa Ramachandran
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfJamie (Taka) Wang
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesDavid Newbury
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 

Dernier (20)

AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
20150722 - AGV
20150722 - AGV20150722 - AGV
20150722 - AGV
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
201610817 - edge part1
201610817 - edge part1201610817 - edge part1
201610817 - edge part1
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 

Pimp My Java LavaJUG