Java 11于2018年9月25日正式发布,这是一个长期支持(LTS)版本,请在此处下载Java 11或此openJDK已归档 。
Java 11功能。
- JEP 181:基于嵌套的访问控制
- JEP 309:动态类文件常量
- JEP 315:改进Aarch64本征
- JEP 318:Epsilon:无操作垃圾收集器(实验性)
- JEP 320:删除Java EE和CORBA模块
- JEP 321:HTTP客户端(标准) (开发人员功能)
- JEP 323:Lambda参数的本地变量语法 (开发人员功能)
- JEP 324:与Curve25519和Curve448的关键协议
- JEP 327:Unicode 10
- JEP 328:飞行记录器
- JEP 329:ChaCha20和Poly1305加密算法
- JEP 330:启动单文件源代码程序
- JEP 331:低开销堆分析
- JEP 332:传输层安全性(TLS)1.3
- JEP 333:ZGC:可扩展的低延迟垃圾收集器(实验性)
- JEP 335:弃用Nashorn JavaScript引擎
- JEP 336:弃用Pack200工具和API
JEP 181:基于嵌套的访问控制
它直接支持嵌套成员内部的私有访问,而不再通过自动生成的桥接方法access$000
。 此外,新的嵌套API用于验证并允许嵌套成员内的私有反射访问。
在Java 11.之前
public class Alphabet {
private String name = "I'm Alphabet!";
public class A {
public void printName() {
System.out.println(name); // access Alphabet's private member!
}
}
}
如果编译上面的类,它将生成两个类, Alphabet
和Alphabet$A
,即使嵌套类也是具有唯一名称的典型类。 JVM访问规则将不允许不同类内的私有访问。 但是,Java允许嵌套成员内的私有访问,因此Java编译器创建了一个桥接方法access$000
来应用于JVM访问规则。
// After javac Alphabet.java, Java compiler created something similar to this.
public class Alphabet {
private String name = "I'm Alphabet!";
String access$000(){
return name;
}
}
public class Alphabet$A {
final Alphabet obj;
public void printName(){
System.out.println(obj.access$000());
}
}
在Java 11中,Java编译器不会为嵌套成员内的私有访问生成任何桥接方法access$000
。 这个新的JVM访问规则,即基于嵌套的访问控制,允许嵌套成员内的私有访问。
进一步阅读
Java 11 –基于嵌套的访问控制
JEP 309:动态类文件常量
扩展类文件格式以支持新的常量池形式CONSTANT_Dynamic
,目标语言设计者和编译器实现者。
JEP 315:改进Aarch64本征
优化了现有的字符串和数组内部函数,并在Arm64或Aarch64处理器上为Math.sin()
, Math.cos()
和Match.log()
实现了新的内部函数。 这意味着更好的性能。
PS 内部函数用于利用特定于CPU体系结构的汇编代码来提高性能。
JEP 318:Epsilon:无操作垃圾收集器(实验性)
一个新的No-Op(无操作)垃圾收集器,它分配内存,但不会收集任何垃圾(内存分配),一旦Java堆耗尽,JVM将关闭。
一些用例:
- 性能测试
- VM接口测试
- 短期工作
此GC是实验功能; 我们需要使用以下选项来启用新的Epsilon GC。
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
JEP 320:删除Java EE和CORBA模块
Java 9不推荐使用以下Java EE和CORBA模块,现在已在Java 11中删除。如果要迁移到Java 11,请确保您的项目未使用以下任何软件包或工具。
删除的软件包:
- java.xml.ws(JAX-WS)
- java.xml.bind(JAXB)
- java.activation(JAF)
- java.xml.ws.annotation(通用注释)
- java.corba(CORBA)
- java.transaction(JTA)
- java.se.ee(上面六个模块的Aggregator模块)
删除的工具:
- wsgen和wsimport(来自jdk.xml.ws)
- schemagen和xjc(来自jdk.xml.bind)
- idlj,orbd,servertool和tnamesrv(来自java.corba)
JEP 321:HTTP客户端(标准)
java.net.http
包中的HTTP Client API
是在Java 9中引入的,在Java 10中进行了更新,现在是Java 11中的标准功能。
Java 11 HttpClient
发送简单的GET
请求。
HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("https://httpbin.org/get"))
.setHeader("User-Agent", "Java 11 HttpClient Bot")
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
HttpHeaders headers = response.headers();
headers.map().forEach((k, v) -> System.out.println(k + ":" + v));
System.out.println(response.statusCode());
System.out.println(response.body());
进一步阅读
Java 11 HttpClient示例
JEP 323:Lambda参数的本地变量语法
该JEP在lambda参数中添加了对var
关键字的支持。
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream()
.map((var x) -> x.toUpperCase())
.collect(Collectors.joining(","));
System.out.println(result2);
但是,lambda可以进行类型推断。 上面的示例与此等效:
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream()
.map(x -> x.toUpperCase())
.collect(Collectors.joining(","));
那么,为什么这个JEP在lambda参数中添加var
? 现在的好处是我们可以向lambda参数添加注释,请参见以下示例:
import org.jetbrains.annotations.NotNull;
List<String> list = Arrays.asList("a", "b", "c", null);
String result = list.stream()
.map((@NotNull var x) -> x.toUpperCase())
.collect(Collectors.joining(","));
System.out.println(result3);
JEP 324:与Curve25519和Curve448的关键协议
Java密码学相关项目。 它将现有的椭圆曲线Diffie-Hellman(ECDH)方案替换为Curve25519和Curve448算法,这是RFC 7748中定义的关键协议方案。
一个使用Curve25519
算法生成密钥对的简单KeyPairGenerator
示例。
package com.mkyong.java11.jep324;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.NamedParameterSpec;
public class GenerateKeyPairs {
public static void main(String[] args) throws NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("XDH");
NamedParameterSpec paramSpec = new NamedParameterSpec("X25519");
kpg.initialize(paramSpec); // equivalent to kpg.initialize(255)
// alternatively: kpg = KeyPairGenerator.getInstance("X25519")
KeyPair kp = kpg.generateKeyPair();
System.out.println("--- Public Key ---");
PublicKey publicKey = kp.getPublic();
System.out.println(publicKey.getAlgorithm()); // XDH
System.out.println(publicKey.getFormat()); // X.509
// save this public key
byte[] pubKey = publicKey.getEncoded();
System.out.println("---");
System.out.println("--- Private Key ---");
PrivateKey privateKey = kp.getPrivate();
System.out.println(privateKey.getAlgorithm()); // XDH
System.out.println(privateKey.getFormat()); // PKCS#8
// save this private key
byte[] priKey = privateKey.getEncoded();
}
}
进一步阅读
有关更多示例,请参考JEP 324和Oracle – Java安全标准算法名称 。
JEP 327:Unicode 10
这意味着更多的代码点,更多的表情符号图标🙂下面的示例打印Unicode代码点。
package com.mkyong.java11;
public class PrintUnicode {
public static void main(String[] args) {
String codepoint = "U+1F92A"; // crazy face
System.out.println(convertCodePoints(codepoint));
}
// Java, UTF-16
// Convert code point to unicode
static char[] convertCodePoints(String codePoint) {
Integer i = Integer.valueOf(codePoint.substring(2), 16);
char[] chars = Character.toChars(i);
return chars;
}
}
进一步阅读。
- Unicode 10
- Unicode 10.0的新增功能
- [在Java中使用Unicode的乐趣](https://www.codetab.org/post/java-unicode-basics/)
JEP 328:飞行记录器
Java Flight Recorder(JFR)是Oracle JDK的商业产品,现在在OpenJDK 11中是开源的。此JFR是用于诊断正在运行的Java应用程序的性能分析工具。 下面的命令在Java应用程序上开始60秒的JFR记录,将记录的数据转储到'.jfr'文件中。
$ java -XX:StartFlightRecording=duration=60s,settings=profile,filename=app.jfr MyHelloWorldApp
那么如何处理.jfr
文件? 我们可以使用Java Mission Control(JMC)来分析和可视化.jfr
文件。
进一步阅读
Java飞行记录器
JEP 329:ChaCha20和Poly1305加密算法
ChaCha20
是一种高速流密码,是一种加密和解密算法。 ChaCha20-Poly1305
意味着ChaCha20
以AEAD模式运行,并带有Poly1305
身份验证器,加密和身份验证,两者均在RFC 7539中定义。 此ChaCha20
加密算法的JEP更新是对不安全的RC4流密码的替代。
ChaCha20
的输入是:
- 256位密钥(32字节)
- 96位随机数(12个字节)
- 32位初始计数(4个字节)
Cipher cipher = Cipher.getInstance("ChaCha20");
ChaCha20ParameterSpec param = new ChaCha20ParameterSpec(nonce, counter);
cipher.init(Cipher.ENCRYPT_MODE, key, param);
byte[] encryptedText = cipher.doFinal(pText);
ChaCha20-Poly1305
的输入为:
- 256位密钥(32字节)
- 96位随机数(12个字节)
Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305");
// IV, initialization value with nonce
IvParameterSpec iv = new IvParameterSpec(nonce);
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] encryptedText = cipher.doFinal(pText);
请参考此Java 11 – ChaCha20-Poly1305加密示例
JEP 330:启动单文件源代码程序
此单一文件源代码程序表示单个源代码.java
文件中的整个Java程序。 该JEP在学习Java的早期阶段是一个友好的功能,但是在Java开发中并没有太大的好处,我们都使用IDE。
查看单个文件源代码。
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
在Java 11.之前
$ javac HelloJava.java
$ java HelloJava
Hello World!
现在是Java 11。
$ java HelloJava.java
Hello World!
舍邦#!
现在,可以使用Linux Shebang将单个Java程序作为脚本运行。
#!/opt/java/openjdk/bin/java --source 11
public class SheBang {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
JEP 331:低开销堆分析
Java虚拟机工具接口(JVMTI)是在J2SE 5,JDK 5(老虎)中引入的,它提供了用于概要分析或监视工具以访问JVM状态的API。 该JEP在JVMIT中添加了新的低开销堆分析API。
进一步阅读
Oracle – JVMTM工具界面
JEP 332:传输层安全性(TLS)1.3
Java 11支持RFC 8446传输层安全性(TLS)1.3协议。 但是,并非所有TLS 1.3功能都已实现,有关详细信息,请参考此JEP 332 。
Java安全套接字扩展(JSSE)+ TLS 1.3示例。
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
SSLSocketFactory factory =
(SSLSocketFactory) SSLSocketFactory.getDefault();
socket =
(SSLSocket) factory.createSocket("google.com", 443);
socket.setEnabledProtocols(new String[]{"TLSv1.3"});
socket.setEnabledCipherSuites(new String[]{"TLS_AES_128_GCM_SHA256"});
JEP 333:ZGC:可扩展的低延迟垃圾收集器(实验性)
Z垃圾收集器(ZGC)是实验性垃圾收集器; 它的暂停时间不超过10毫秒。 此ZCG仅在Linux / 64中支持。
进一步阅读
PS在Java 14中,此ZCG扩展了对macOS JEP 364和Windows JEP 365的支持 。
JEP 335:弃用Nashorn JavaScript引擎
Nashorn JavaScript脚本引擎和jjs
工具已被弃用,将来的发行版中可能会删除它。
PS Nashorn在Java 8 JEP 174中引入,以替代Rhino Javascript引擎。
JEP 336:弃用Pack200工具和API
此JEP不推荐使用pack200
和unpack200
工具以及java.util.jar
软件包中的Pack200
API,并且可能会在将来的版本中删除它。
PS Java 14 JEP 367中删除了Pack200工具和API。
下载源代码
$ git clone https://github.com/mkyong/core-java
$ cd java-11
参考文献
- OpenJDK 11项目
- Java版本历史
- Unicode 10
- 维基百科– Aarch64处理器
- 维基百科–内在的
- Java安全性有哪些新功能?
- Oracle – Java安全标准算法名称
- RFC 7748
- 维基百科– Curve25519
- 维基百科– Curve448
- Java飞行记录器
- Java任务控制(JMC)
- RFC 7539
- Java 11 – Chipher
- ChaCha20
- RC4
- Java 11 – ChaCha20流密码示例
- Java 11 – ChaCha20-Poly1305加密示例
- Docker中的Java 11 Shebang示例
- 维基百科– Java虚拟机工具界面
- Oracle – JVMTM工具界面
- Java SSLSocket TLS 1.3示例
- RFC 8446
- Oracle – Java安全开发人员指南
- Oracle – Z垃圾收集器
- OpenJDK Wiki – ZCG
- Oracle – Z垃圾收集器
- Java 11 HttpClient示例