Java 11的新增功能

Java 11徽标

Java 11于2018年9月25日正式发布,这是一个长期支持(LTS)版本,请在此处下载Java 11或此openJDK已归档

Java 11功能。

JEP 181:基于嵌套的访问控制

它直接支持嵌套成员内部的私有访问,而不再通过自动生成的桥接方法access$000 。 此外,新的嵌套API用于验证并允许嵌套成员内的私有反射访问。

在Java 11.之前

.java
public class Alphabet {
    private String name = "I'm Alphabet!";

    public class A {
        public void printName() {
            System.out.println(name);       // access Alphabet's private member!
        }
    }
}

如果编译上面的类,它将生成两个类, AlphabetAlphabet$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)方案替换为Curve25519Curve448算法,这是RFC 7748中定义的关键协议方案。

一个使用Curve25519算法生成密钥对的简单KeyPairGenerator示例。

GenerateKeyPairs.java
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 324Oracle – Java安全标准算法名称

JEP 327:Unicode 10

这意味着更多的代码点,更多的表情符号图标🙂下面的示例打印Unicode代码点。

PrintUnicode.java
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;

    }

}

进一步阅读。

JEP 328:飞行记录器

Java Flight Recorder(JFR)是Oracle JDK的商业产品,现在在OpenJDK 11中是开源的。此JFR是用于诊断正在运行的Java应用程序的性能分析工具。 下面的命令在Java应用程序上开始60秒的JFR记录,将记录的数据转储到'.jfr'文件中。

Termianl
$ 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);

请参考此Java 11 – ChaCha20流密码示例

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。

查看单个文件源代码。

HelloJava.java
public class HelloJava {

    public static void main(String[] args) {

        System.out.println("Hello World!");

    }
}

在Java 11.之前

Termianl
$ javac HelloJava.java

$ java HelloJava

Hello World!

现在是Java 11。

Termianl
$ java HelloJava.java

Hello World!

舍邦#!
现在,可以使用Linux Shebang将单个Java程序作为脚本运行。

run.sh
#!/opt/java/openjdk/bin/java --source 11
public class SheBang {

    public static void main(String[] args) {

        System.out.println("Hello World!");

    }
}

请参考Docker中的Java 11 shebang示例

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"});

请参考此Java SSLSocket TLS 1.3示例

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不推荐使用pack200unpack200工具以及java.util.jar软件包中的Pack200 API,并且可能会在将来的版本中删除它。

PS Java 14 JEP 367中删除了Pack200工具和API。

下载源代码

$ git clone https://github.com/mkyong/core-java

$ cd java-11

参考文献

翻译自: https://mkyong.com/java/what-is-new-in-java-11/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值