java15新功能的详细讲解

目录
  • 1. JEP 339 爱德华曲线算法(EdDSA)
  • 2. JEP 360:Sealed Classes(密封类)预览
  • 3. JEP 371:Hidden Classes(隐藏类)
  • 4. JEP 372:移除 Nashorn JavaScript 引擎
  • 5. JEP 373:重新实现 DatagramSocket API
  • 6. JEP 374:禁用和废弃偏向锁(Biased Locking)
  • 7. JEP 375:instanceof 类型匹配 (二次预览)
  • 8. JEP 377:ZGC: 可扩展低延迟垃圾收集器(正式发布)
  • 9. JEP 378: 文本块
  • 10. JEP 379:Shenandoah: 低停顿时间的垃圾收集器
  • 11. JEP 384:Records(二次预览)
  • 其他更新
  • 参考

Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。

Java 15 官方下载:https://jdk.java.net/archive/

Java 15 官方文档:https://openjdk.java.net/projects/jdk/15/

Java 15 新功能:

JEP 描述
JEP 339 爱德华曲线算法(EdDSA)
JEP 360 Sealed Classes(密封类)预览
JEP 371 Hidden Classes(隐藏类)
JEP 372 移除 Nashorn JavaScript 引擎
JEP 373 重新实现 DatagramSocket APII
JEP 374 禁用和废弃偏向锁(Biased Locking)
JEP 375 instanceof 类型匹配 (二次预览)
JEP 377 ZGC: 可扩展低延迟垃圾收集器(正式发布)
JEP 378 文本块
JEP 379 Shenandoah: 低停顿时间的垃圾收集器
JEP 381 删除 Solaris 和 SPARC 端口
JEP 383 外部内存访问 API(第二个孵化器))
JEP 384 Records (二次预览)
JEP 385 废弃 RMI 激活机制

1. JEP 339 爱德华曲线算法(EdDSA)

Java 15 中增加了一个新的密码学算法,爱德华曲线算法(EdDSA)签名算法。它是由 Schnorr 算法发展而来,在 RFC8032 中被定义实现。

package com.wdbyte;

import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Base64;

public class JEP339 {

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
        KeyPair kp = kpg.generateKeyPair();
        byte[] msg = "www.wdbyte.com".getBytes(StandardCharsets.UTF_8);
        Signature sig = Signature.getInstance("Ed25519");
        sig.initSign(kp.getPrivate());
        sig.update(msg);
        byte[] s = sig.sign();
        System.out.println(Base64.getEncoder().encodeToString(s));
    }
}

输出结果:

VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==

2. JEP 360:Sealed Classes(密封类)预览

我们都知道,在 Java 中如果想让一个类不能被继承和修改,这时我们应该使用 final 关键字对类进行修饰。不过这种要么可以继承,要么不能继承的机制不够灵活,有些时候我们可能想让某个类可以被某些类型继承,但是又不能随意继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。这样这个类就只能被指定的类继承。

而且 sealed 修饰的类的机制具有传递性,它的子类必须使用指定的关键字进行修饰,且只能是 final 、sealed 、non-sealed 三者之一。

示例:犬类(Dog)只能被牧羊犬(Collie)和田园犬(TuGou)继承,使用 sealed 关键字。

package com.wdbyte;

public  sealed interface Dog permits Collie, TuGou {
    //...
}

牧羊犬(Collie)只能被边境牧羊犬(BorderCollie)继承。

package com.wdbyte;

/**
 * 牧羊犬
 * @author www.wdbyte.com
 */
public sealed class Collie implements Dog permits BorderCollie {

}

边境牧羊犬(BorderCollie)不能被继承,使用 final 关键字。

package com.wdbyte;

/**
 *
 * @author www.wdbyte.com
 */
public final class BorderCollie extends Collie{
}

田园犬(ToGou)可以被任意继承,使用 non-sealed 关键字。

package com.wdbyte;

/**
 * @author niulang
 */
public non-sealed class TuGou implements Dog {
}

3. JEP 371:Hidden Classes(隐藏类)

这个特性让开发者可以引入一个无法被其他地方发现使用,且类的生命周期有限的类。这对运行时动态生成类的使用方式十分有利,可以减少内存占用,下面是一个使用示例。

package com.wdbyte;

public class JEP371Test {
    public static String lookup() {
      return "www.wdbyte.com";
    }
}

把类 JEP371Test 编译后的 Class 转换成 Base64,然后使用 Java 15 新特性加载调用类中的 lookup 方法。

package com.wdbyte;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Base64;

/**
 * @author www.wdbyte.com
 */
public class JEP371 {

    private static String CLASS_INFO = "yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";

    public static void main(String[] args) throws Throwable {
        byte[] classInBytes = Base64.getDecoder().decode(CLASS_INFO);
        Class<?> proxy = MethodHandles.lookup()
            .defineHiddenClass(classInBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE)
            .lookupClass();

        System.out.println(proxy.getName());
        MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "lookup", MethodType.methodType(String.class));
        String result = (String) mh.invokeExact();
        System.out.println(result);
    }
}

输出结果:

com.wdbyte.JEP371Test/0x0000000800c01800
www.wdbyte.com

4. JEP 372:移除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废弃。由于 ECMAScript 语言发展很快,维护 Nashorn JavaScript 的成本过于高昂,在 Java 15 中被彻底删除。

扩展阅读:Nashorn JavaScript EngineDeprecate the Nashorn JavaScript Engine

5. JEP 373:重新实现 DatagramSocket API

Java 13 中重新实现了旧的 Socket API,在介绍 Java 13 时还有一部分做了这方面的介绍。

现在,Java 15 重新实现了遗留的 DatagramSocket。

扩展阅读:Java 13 新功能介绍

6. JEP 374:禁用和废弃偏向锁(Biased Locking)

在之前,JVM 在处理同步操作,如使用 synchronized 同步时,有一套锁的升级机制,其中有一个锁机制就是偏向锁。然而通过目前的 Java 开发环境来看,使用这些被 synchronized 同步的类的机会并不多,如开发者更喜欢使用 HashMap 或者 ArrayList 而非 HashTable 和 Vector。

即使换个角度,当初使用偏向锁是为了提高性能,如今看来性能提升的程度和使用次数都不太有用。而偏向锁的引入增加了 JVM 的复杂性。

所以现在偏向锁被默认禁用,在不久的将来将会彻底删除,对于 Java 15,我们仍然可以使用-XX:+UseBiasedLocking 启用偏向锁定,但它会提示 这是一个已弃用的 API。

7. JEP 375:instanceof 类型匹配 (二次预览)

instanceof 类型匹配在 Java 14 中已经改进,这次仅仅再次预览,没有任何改动,用于接受更多的使用反馈。这个特性在 Java 16 中成为正式特性。

在之前,使用 instanceof 进行类型判断之后,需要进行对象类型转换后才能使用。

package com.wdbyte;

import java.util.ArrayList;
import java.util.List;

public class Java14BeaforInstanceof {

    public static void main(String[] args) {
        Object obj = new ArrayList<>();
        if (obj instanceof ArrayList) {
            ArrayList list = (ArrayList)obj;
            list.add("www.wdbyte.com");
        }
        System.out.println(obj);
    }
}

而在 Java 14 中,可以在判断类型时指定变量名称进行类型转换,方便了使用。

package com.wdbyte;

import java.util.ArrayList;

public class Java14Instanceof {
    public static void main(String[] args) {
        Object obj = new ArrayList<>();
        if (obj instanceof ArrayList list) {
            list.add("www.wdbyte.com");
        }
        System.out.println(obj);
    }
}

可以看到,在使用 instanceof 判断类型成立后,会自动强制转换类型为指定类型。

输出结果:

[www.wdbyte.com]

扩展阅读:Java 14 新功能介绍

8. JEP 377:ZGC: 可扩展低延迟垃圾收集器(正式发布)

ZGC 垃圾收集器在 Java 11 中被引入,但是因为收集器的复杂性,当初决定逐渐引入。然后不断的听取用户的反馈建议修复问题。而现在,已经很久没有收到用户的问题反馈了,ZGC 是时候投入正式使用阶段了。所以在 Java 15 中 ZGC 正式发布,可以使用下面的参数启用 ZGC。

$ java -XX:+UseZGC className

9. JEP 378: 文本块

文本块在 Java 12 JEP 326 原始字符串文字 中引入,在 Java 13 JEP 355:文本块(预览) 中开始预览,在 Java 14 JEP 368:文本块(第二次预览),而现在,在 Java 15 ,文本块是正式的功能特性了。

String content = """
        {
            "upperSummary": null,\
            "sensitiveTypeList": null,
            "gmtModified": "2011-08-05\s10:50:09",
        }
         """;
System.out.println(content);

扩展阅读:Java 14 新功能介绍- JEP368 文本块

10. JEP 379:Shenandoah: 低停顿时间的垃圾收集器

Shenandoah 垃圾收集器在 Java 12 中开始引入,Java 15 中成为了正式功能的一部分,可以使用下面的参数启用 Shenandoah 垃圾收集器。

java -XX:+UseShenandoahGC

但是 openJDK 15 中默认是没有 Shenandoah 收集器,想要使用此功能可以下载 AdoptOpenJDK

为什么 openJDK 中没有 Shenandoah 垃圾收集器?

Shenandoah 是一个高性能、低暂停时间的垃圾收集器,它是 Red Hat 主导的项目。当 Red Hat 第一次提议将 Shenandoah 贡献给 OpenJDK 时,Oracle 明确表示不想支持它,OpenJDK 作为一个免费软件,不想支持 Red Hat 的 Shenandoah 完全没有问题。

最后 Red Hat 选择和 Oracle 合作设计一个真正干净的可插拔垃圾收集器接口,允许任何人轻松选择垃圾收集器以包含在他们的构建中。最终 Shenandoah 进入了 JDK 12,但是没有构建进 OpenJDK。

11. JEP 384:Records(二次预览)

在 Java 14 中引入了 Record 类,Java 15 中对 Record 进行了增强。使它可以支持密封类型、Record 注解以及相关的反射 API 等。

示例:Record 支持密封(sealed)类型。

package com.wdbyte;

/**
 * @author www.wdbyte.com
 */
public sealed interface DataBase permits DataBaseSelect, DataBaseUpdate {
}

final record DataBaseSelect(@Deprecated String table, String sql) implements DataBase {
}

final record DataBaseUpdate() implements DataBase {
}

在 java.lang.Class 增加了两个公共方法用于获取 Record 类信息:

  1. RecordComponent[] getRecordComponents()
  2. boolean isRecord()

其他更新

JEP 381:删除 Solaris 和 SPARC 端口

Java 14 JEP 362弃用了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,现在它在 Java 15 中被正式删除。

JEP 383:外部内存访问 API(第二个孵化器)

JEP 385:废弃 RMI 激活机制

只是废弃 RMI 激活机制,不影响 RMI 其他功能。

参考

https://openjdk.java.net/projects/jdk/15/

https://docs.oracle.com/en/java/javase/14/docs/specs/rmi/activation.html

https://mkyong.com/java/what-is-new-in-java-15/

到此这篇关于java15新功能的详细讲解的文章就介绍到这了,更多相关java15新功能介绍内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java8到java15的新功能简介

    本博文将为您提供自Java 7以来增加的很棒的新功能的示例.我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java 15都有.Java现在完全支持lambda和函数式编程,类型推断通过var,具有简单构造函数的不可变集合以及多行字符串.此外,还有令人兴奋的实验新功能,例如数据类(record)和sealed类.最后,我将讨论Java REPL,它为快速实验提供了很高的价值. 函数式编程(Java 8) 在Java 8中,功能编程和lambda被添加为语言功能.函数式编程的

  • java15新功能的详细讲解

    目录 1. JEP 339 爱德华曲线算法(EdDSA) 2. JEP 360:Sealed Classes(密封类)预览 3. JEP 371:Hidden Classes(隐藏类) 4. JEP 372:移除 Nashorn JavaScript 引擎 5. JEP 373:重新实现 DatagramSocket API 6. JEP 374:禁用和废弃偏向锁(Biased Locking) 7. JEP 375:instanceof 类型匹配 (二次预览) 8. JEP 377:ZGC:

  • Spring Service功能作用详细讲解

    目录 1. Spring项目中的核心组成部分 2. Spring项目中的Service 2.1 Service的功能作用 2.2 Service的实现 1. Spring项目中的核心组成部分 项目的核心组成部分图解: 2. Spring项目中的Service 2.1 Service的功能作用 Service是项目中用于处理业务逻辑的,因为每种数据在做某种操作时,应该都有某些规则: 例如用户尝试登录时,涉及的规则可能包含:用户名对应的用户信息必须存在.提交的密码必须与数据库中存储的密码是匹配的……

  • 7个好用的TypeScript新功能

    1. 可选链 从 v3.7 可用 这是当你尝试访问嵌套数据时的一个痛点,嵌套数据越多,代码就会变得越繁琐. 在下面的例子中,要访问address,你必须遍历data.customer.address,而且data或customer有可能是undefined,所以通常使用&&运算符或类似例子中的技巧遍历检查每个层次的定义. 现在你可以用.?运算符来选择性地对数据访问.通过这种方式,如果存在尚未定义的父级对象,则会在链中的任何位置返回未定义,而不是在运行时崩溃. // v3.7 以前 if (

  • Python OpenCV超详细讲解基本功能

    目录 准备工作 转成灰度图像 高斯模糊 边缘检测 膨胀运算 腐蚀运算 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 转成灰度图像 调用imread()方法获取我们资源文件夹中的图片lena.png cvtColor()方法可以让我们的图片转换成任意颜色,第一个参数是我们要转换的图片,第二个参数是要转成的颜色空间,cv2.COLOR_BGR2GRAY就是由BGR变为GRAY,我们日常生活中都是RGB三通道顺序,而在Op

  • MyBatis超详细讲解如何实现分页功能

    目录 概述: 一般用法: student表: Student.java StudentMapper.xml StudentService.java StudentServiceImpl.java AppTest.java 测试结果: 使用分页参数RowBound StudentMapper.xml 概述: 当希望能直接在数据库语言中只检索符合条件的记录,不需要再通过程序对其做处理时,SQL语句分页技术便横空出世了,通过SQL语句实现分页只需要改变查询语句就能实现,即在SQL语句后面添加limit

  • Spring 4.0新功能:@Conditional注解详细介绍

    前言 最近在学习spring,抽空会将学习的知识总结下面,本文我们会接触spring 4的新功能:@Conditional注解.在之前的spring版本中,你处理conditions只有以下两个方法: 在3.1版本之前,你需要使用spring expression language 在3.1版本发布时,profiles被引入来处理conditions. 让我们分别看看以上两者,在来理解spring 4带来的@Conditional注解. Spring Expression Language(SP

  • python中最小二乘法详细讲解

    python中在实现一元线性回归时会使用最小二乘法,那你知道最小二乘法是什么吗.其实最小二乘法为分类回归算法的基础,从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法.本文向大家介绍python中的最小二乘法. 一.最小二乘法是什么 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出). 二.最小二乘法实现原理 通过最小化误差的平方和寻找数据的最佳函数匹配. 三.最小二乘法功

  • Python文件的操作示例的详细讲解

    1. 文件的读写原理: 文件的读写称为I/O操作. 操作原理: .py文件是用解释器去运行,调用OS操作系统的资源,去操作磁盘上的文件. 操作流程: 在去操作一个文件的文件的时候,首先打开或者创建一个文件,进行读或者写. 读: 从文件拿到内存当中来 写:把内存的文件放入文件中 最后进行关闭资源. 内置函数: open() 可以创建或者打开一个文件 语法规则: file=open(filename [mode,encoding] 打开模式默认为只读 默认文本中的字符编码格式为gbk # 作者:互联

  • 详细讲解计算机网络——应用层

    目录 应用层协议 一.DNS 1.DNS 是什么 2.域名结构 3.域名服务器 4.DNS 解析流程 5.DNS 服务器查询方式 (1)迭代查询 (2)递归查询 6.DNS 缓存机制 7.DNS 使用 UDP 还是 TCP 区域传送(主.辅 DNS 服务器通信)时使用 TCP 域名解析时使用 UDP 二.万维网 1.万维网概述 (1)超媒体与超文本 (2)万维网的工作方式 (3)万维网必须解决的问题 2.超文本传送协议 HTTP (1)HTTP 的操作过程 (2)请求一个万维网文档所需的时间 3

随机推荐