SlideShare a Scribd company logo
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

More Related Content

What's hot

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 hero
Jeremy 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 Javassist
Anton Arhipov
 
What`s new in Java 7
What`s new in Java 7What`s new in Java 7
What`s new in Java 7
Georgian Micsa
 
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
 
C tutorial
C tutorialC tutorial
C tutorial
Diwakar_singh1989
 
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 Tutorial
Justin Lin
 
Mastering Namespaces in PHP
Mastering Namespaces in PHPMastering Namespaces in PHP
Mastering Namespaces in PHP
Nick Belhomme
 
Php Debugger
Php DebuggerPhp Debugger
Php Debugger
guest8cd374
 
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 Agents
Anton Arhipov
 
Puppet modules: An Holistic Approach
Puppet modules: An Holistic ApproachPuppet modules: An Holistic Approach
Puppet modules: An Holistic Approach
Alessandro Franceschi
 
Debugging of (C)Python applications
Debugging of (C)Python applicationsDebugging of (C)Python applications
Debugging of (C)Python applications
Roman Podoliaka
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
chartjes
 
Deep C
Deep CDeep C
Deep C
Olve Maudal
 
Java Platform Module System
Java Platform Module SystemJava Platform Module System
Java Platform Module System
Vignesh Ramesh
 
Invokedynamic / JSR-292
Invokedynamic / JSR-292Invokedynamic / JSR-292
Invokedynamic / JSR-292ytoshima
 

What's hot (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?
 

Similar to 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 JUG
Sylvain 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
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
Ecommerce Solution Provider SysIQ
 
JavaFX8 TestFX - CDI
JavaFX8   TestFX - CDIJavaFX8   TestFX - CDI
JavaFX8 TestFX - CDI
Sven 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
 
In Vogue Dynamic
In Vogue DynamicIn Vogue Dynamic
In Vogue Dynamic
Alexander Shopov
 
lecture 6
 lecture 6 lecture 6
lecture 6
umardanjumamaiwada
 
Introduction to computer science
Introduction to computer scienceIntroduction to computer science
Introduction to computer science
umardanjumamaiwada
 
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
Raimon Ràfols
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
ciklum_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 reference
Giacomo Veneri
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agents
Rafael 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 features
shrinath97
 
Java lab-manual
Java lab-manualJava lab-manual
Java lab-manual
Khurshid Asghar
 
core java material.pdf
core java material.pdfcore java material.pdf
core java material.pdf
Rasa72
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM Bytecode
Joe Kutner
 
Groovy!
Groovy!Groovy!
Groovy!
Petr Giecek
 

Similar to 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!
 

More from 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 world
Daniel 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 + LyonMug
Daniel 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 2013
Daniel 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
 

More from 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
 

Recently uploaded

Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
UiPathCommunity
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
RinaMondal9
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Assure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyesAssure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
Alison B. Lowndes
 

Recently uploaded (20)

Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Assure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyesAssure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyes
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 

Pimp My Java LavaJUG