Upload
agora-group
View
862
Download
2
Tags:
Embed Size (px)
Citation preview
<Insert Picture Here>
The Future of the Java Platform:Java SE 7 & Java SE 8
Terrence BarrSenior Technologist, Mobile & Embedded Technologies
22
The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.
The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
33
Project Coin (JSR 334)Small Language Changes
The DaVinci MachineMultiple Languages on the JVMinvokedynamic (JSR 292)
Agenda
Library changesMiscellaneous Updates
JSR 337: Java SE 8 Release Contents
SmallSmall(Language)(Language)
ChangesChangesProject CoinProject Coin
44
Evolving the LanguageFrom “Evolving the Java Language” - JavaOne 2005
• Java language principles– Reading is more important than writing
– The language should not hide what is happening
– Code should do what it seems to do
– Simplicity matters
– Every “good” feature adds more “bad” weight
– Sometimes it is best to leave things out
• One language: with the same meaning everywhere• No dialects
• We will evolve the Java language• But cautiously, with a long term view
• “first, do no harm”
• Beware: Changes have many downstream implications (spec, tests, implementation(s), tools, compatibility, future, ...)
55
Java Standard Edition (Java SE) vs.Java Development Kit (JDK)
• Java SE• Definition of the software
platform• Specification documents• Implementation• Test suite (TCK)
• Implemented by several groups
• Produced in the JCP
• Java Development Kit• Oracle's implementation of
Java SE• Additional features not in
the spec• Tools and documentation• Deployment and
management capabilities• Performance features• Produced in the OpenJDK
project
66
Java SE 7
77
<Insert Picture Here>
Section DividerSmallSmall
(Language)(Language)ChangesChanges
Project CoinProject Coin
88
Project Coin Constraints
• Small language changes• Small in specification, implementation, testing• No new keywords!• Wary of type system changes
• Coordinate with larger language changes– Project Lambda– Modularity
• One language, one javac
99
Better Integer Literal
• Binary literals
• With underscores for clarity
int mask = 0b101010101010;
int mask = 0b1010_1010_1010;long big = 9_223_783_036_967_937L;
1010
String Switch Statement
• Today case label includes integer constants and enum constants
• Strings are constants too (immutable)
1111
Discriminating Strings Today
int monthNameToDays(String s, int year) {
if("April".equals(s) || "June".equals(s) ||"September".equals(s) ||"November".equals(s))
return 30;
if("January".equals(s) || "March".equals(s) ||"May".equals(s) || "July".equals(s) ||"August".equals(s) || "December".equals(s))
return 31;
if("February".equals(s))...
1212
Strings in Switchint monthNameToDays(String s, int year) {
switch(s) {case "April": case "June":case "September": case "November":
return 30;
case "January": case "March":case "May": case "July":case "August": case "December":
return 31;
case "February":...
default:...
1313
Simplifying Generics
• Pre-genericsList strList = new ArrayList();
1414
Simplifying Generics
• Pre-genericsList strList = new ArrayList();
• With GenericsList<String> strList = new ArrayList<String>();
1515
Simplifying Generics
• Pre-genericsList strList = new ArrayList();
• With GenericsList<String> strList = new ArrayList<String>();List<Map<String, List<String>> strList =
new ArrayList<Map<String, List<String>>();
1616
Diamond Operator
• Pre-genericsList strList = new ArrayList();
• With Generics
• With diamond (<>) compiler infers type
List<String> strList = new ArrayList<String>();List<Map<String, List<String>> strList =
new ArrayList<Map<String, List<String>>();
List<String> strList = new ArrayList<>();List<Map<String, List<String>> strList =
new ArrayList<>();
1717
Simplifying Resource Use
InputStream in = new FileInputStream(src);OutputStream out = new FileOutputStream(dest);
byte[] buf = new byte[8192];int n;
while (n = in.read(buf)) >= 0) out.write(buf, 0, n);
1818
Simplifying Resource Use
InputStream in = new FileInputStream(src);OutputStream out = new FileOutputStream(dest);
try { byte[] buf = new byte[8192]; int n; while (n = in.read(buf)) >= 0) out.write(buf, 0, n);} finally { in.close(); out.close();}
1919
Simplifying Resource Use
InputStream in = new FileInputStream(src);try { OutputStream out = new FileOutputStream(dest); try { byte[] buf = new byte[8192]; int n; while (n = in.read(buf)) >= 0) out.write(buf, 0, n); } finally { out.close(); }} finally { in.close();}
2020
Automatic Resource Management
try (InputStream in = new FileInputStream(src), OutputStream out = new FileOutputStream(dest)){ byte[] buf = new byte[8192]; int n; while (n = in.read(buf)) >= 0) out.write(buf, 0, n);}
2121
Exceptions Galoretry {
...} catch(ClassNotFoundException cnfe) {
doSomething(cnfe);throw cnfe;
} catch(InstantiationException ie) {log(ie);throw ie;
} catch(NoSuchMethodException nsme) {log(nsme);throw nsme;
} catch(InvocationTargetException ite) {log(ite);throw ite;
}
2222
Multi-Catch
try {// Reflective operations calling Class.forName,// Class.newInstance, Class.getMethod,// Method.invoke, etc.
} catch (final ClassCastException e) { doSomething(e); throw e;} catch(final InstantiationException |
NoSuchMethodException |InvocationTargetException e) {
log(e);throw e;
}
2323
More Precise Rethrowtry {
// Reflective operations calling Class.forName,// Class.newInstance, Class.getMethod,// Method.invoke, etc.
} catch(final ReflectiveOperationException e) {//e means any of the subtype thrown from try {}log(e);throw e;
}
ReflectiveOperationException
ClassNotFoundException
InstantiationException
NoSuchMethodException
InvocationTargetException
http://download.java.net/jdk7/docs/api/java/lang/ReflectiveOperationException.html
2424
The DaVinci Machine ProjectJSR 292A multi-language renaissance for the JVMopenjdk.java.net/projects/mlvm
● Dynamic Invocation● InvokeDynamic bytecode
● Method Handles
2525
2626
JVM Architecture
• Stack based • Push operand on to the stack• Instructions operates by popping data off the stack• Pushes result back on the stack
• Data types • Eight primitive types, objects and arrays
• Object model – single inheritance with interfaces• Method resolution
• Receiver and method name• Statically typed for parameters and return types• Dynamic linking + static type checking
• Verified at runtime
2727
JVM Specification
“The Java virtual machine knows nothing about the Java
programming language, only of a particular binary format, the class
file format.”
1.2 The Java Virtual Machine Spec.
2828
Languages Running on the JVM
28
Clojure
Tcl
JavaScript
v-language
CAL
Sather
Funnel
MiniPLAN
Lisp
Scheme
Basic
Logo JHCR
TermWare
Drools
Prolog
LLP
JESS
Eiffel
Smalltalk
C#
G
Groovy
Nice
Anvil
Hojo
Correlate
Ada
Bex Script
Tea
PHP
PhobosSleep
FScript
JudoScript
JRuby
ObjectScript
Jickle
Yoix
Simkin
BeanShell
DawnWebL
iScript
Jython
Pnuts
Yassl
Forth
PiccolaSALSA
Processing
Zigzag
Tiger
Tiger
IconPascal
Oberon
Modula-2
Luck
E
Rexx Scala
2929
Method Calls● Calling a method is cheap (VMs can even inline!)● Selecting the right target method can be expensive
● Static languages do most of their method selection at compile time
● Single-dispatch on receiver type is left for runtime
● Dynamic languages do almost none at compile time● But it would be nice to not have to re-do method selection
for every single invocation
● Each Language has its own ideas about linkage
3030
InvokeDynamic Bytecode
• JVM currently has four ways to invoke method• Invokevirtual, invokeinterface, invokestatic, invokespecial
• All require full method signature data
• InvokeDynamic will use method handle• Effectively an indirect pointer to the method
• When dynamic method is first called bootstrap code determines method and creates handle
• Subsequent calls simply reference defined handle• Type changes force a re-compute of the method
location and an update to the handle• Method call changes are invisible to calling code
3131
LibraryChanges
3232
New I/O 2 (NIO2) Libraries
• Original Java I/O APIs presented challenges for developers • Not designed to be extensible• Many methods do not throw exceptions as expected
• rename() method works inconsistently
• Developers want greater access to file metadata
• Java NIO2 solves these problems
JSR 203
3333
Java NIO2 Features
• Path is a replacement for File• Biggest impact on developers
• Better directory support• list() method can stream via iterator
• Entries can be filtered using regular expressions in API
• Symbolic link support• Two security models (POSIX, ACL based on NFSv4)• java.nio.file.Filesystem
• interface to a filesystem (FAT, ZFS, Zip archive, network, etc)
• java.nio.file.attribute package• Access to file metadata
3434
Concurrency APIs
• JSR166y• Update to JSR166x which was an update to JSR166
• Adds a lightweight task framework• Also referred to as Fork/Join
• Uses ParallelArray• Greatly simplifies use of many cores/processors for tasks that
can easily be separated
3535
Client Libraries
• Nimbus Look and Feel• Platform APIs for shaped and translucent windows• JLayer (formerly from Swing labs)• Optimized 2D rendering
3636
Nimbus Look and Feel
3737
JLayer componentEasy enrichment for Swing components
3838
JLayer componentThe universal decorator
• Transparent decorator for a Swing component• Controls the painting of its subcomponents• Catches all input and focus events for the whole hierarchy
// wrap your component with JLayerJLayer<JPanel> layer = new JLayer<JPanel>(panel);
// custom ui provides all extra functionalitylayer.setUI(myLayerUI);
// add the layer as usual componentframe.add(layer);
3939
Miscellaneous Updates
• Security• Eliptic curve cryptography• TLS 1.2
• JAXP 1.4.4 (Java API for XML processing)• JAX-WS 2.2 (Java API for XML Web Services)• JAXB 2.2 (Java Architecture for XML Binding)• ClassLoader architecture changes
• close() for URLClassLoader
• Javadoc support for CSS
4040
Platform Support
• Windows (x86)• Linux (x86)
• Redhat• Ubuntu
• Solaris (x86)• New: Apple OSX (x86)
4141
Java SE 8
4242
More Project CoinSmall Language Changes
Project Lambda (JSR 335)Closures and moreBetter support for multi-core processors
Project JigsawModularising the Java Platform
Java SE 8
4343
The Modular Java Platform
• Enables escape from “JAR Hell”– Eliminates class path– Package modules for automatic download & install– Generate native packages – deb, rpm, ips, etc
• Enables significant performance improvements– Incremental download → fast classloading– Optimise module content during installation
• Platform scalability – down to small devices– Well-specified SE subsets can fit into small devices
4444
module-info.java
module com.foo @ 1.0.0 {class com.foo.app.Mainrequires org.bar.lib @ 2.1-alpha;requires edu.baz.util @ 5.2_11;provides com.foo.app.lib @ 1.0.0;
}
Module name
VersionEntry point
Dependency
Virtual module
4545
Project LambdaClosures and moreopenjdk.java.net/projects/lambda
● Lambda expressions● SAM conversion with target typing● Method references● Library enhancements for internal iteration● Default methods for interface evolution
4646
Hypothetical Internal Iteration
• Not inherently serial– students traversal not determined by developer– Looks like a functional language
• Anonymous inner class!
double highestScore = students.filter(new Predicate<Student>() {
public boolean isTrue(Student s) {return s.gradYear == 2010;
}}).map(new Extractor<Student,Double>() {
public Double extract(Student s) {return s.score;
}}).max();
4747
Introducing Lambda Expressions
• Lambda expressions introduced with #– Signal to the JVM to defer execution of the code– Body may be an expression
• Lambda expression are not syntactic sugar for anonymous inner class – Implemented with MethodHandle from JSR-292
double highestScore = students.filter(#{ Student s -> s.gradYear == 2010 }).map(#{ Student s -> s.score }).max();
4848
Roadmaps Are Approved!
• JSRs approved by JCP– JSR 334: Small enhancements to the Java language– JSR 335: Lambda expressions for the Java language– JSR 336: Java SE 7 Release Contents– JSR 337: Java SE 8 Release Contents
• OpenJDK Releases in 2011 & 2012– Committed Features List for 2011:
• openjdk.java.net/projects/jdk7/features
4949
Conclusions
• Java SE 7• Incremental changes• Evolutionary, not revolutionary• Good solid set of features to make developers life easier
• Java SE 8• Major new features: Modularisation and Closures• More smaller features to be defined
• Java Evolution Continues • Grow and adapt to the changing world of IT• Oracle and its partners are committed to a vibrant and
evolving Java ecosystem
5050