SlideShare ist ein Scribd-Unternehmen logo
1 von 79
Downloaden Sie, um offline zu lesen
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

Weitere Àhnliche Inhalte

Was ist angesagt?

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
 
What`s new in Java 7
What`s new in Java 7What`s new in Java 7
What`s new in Java 7Georgian 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
 
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
 
Php Debugger
Php DebuggerPhp Debugger
Php Debuggerguest8cd374
 
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
 
JavaFXScript
JavaFXScriptJavaFXScript
JavaFXScriptwebuploader
 
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
 
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?Guillaume Laforge
 

Was ist angesagt? (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?
 

Ähnlich wie 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
 

Ähnlich wie 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!
 

Mehr von 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
 

Mehr von 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
 

KĂŒrzlich hochgeladen

Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vĂĄzquez
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Christopher Logan Kennedy
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 

KĂŒrzlich hochgeladen (20)

Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 

Pimp My Java LavaJUG