Java SE 16 新增特性

作者:Grey

原文地址:Java SE 16 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode:java_new_features

使用反射执行接口中的默认实现方法

作为对接口中默认方法的增强,随着 Java SE 16 的发布,java.lang.reflect.InvocationHandler可以通过使用反射调用接口的默认方法。

详见:JDK-8159746

参考如下示例

package git.snippets.jdk16;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import static java.lang.ClassLoader.getSystemClassLoader; /**
* 反射调用接口的默认方法
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 16
*/
public class InvocationEnhance {
public static void main(String[] args) throws Exception {
invoke();
} static void invoke() throws Exception {
Object proxy = Proxy.newProxyInstance(getSystemClassLoader(), new Class<?>[]{HelloWorld.class}, (prox, method, args) -> {
if (method.isDefault()) {
return InvocationHandler.invokeDefault(prox, method, args);
}
// ...
return prox;
});
Method method = proxy.getClass().getMethod("hello");
System.out.println(method.invoke(proxy).equals("world"));
}
} interface HelloWorld {
default String hello() {
return "world";
}
}

运行输出true

Sealed Classes 二次预览

Sealed Classes 是在Java SE 15中首次引入的,它提供了一种机制来确定哪些子类被允许扩展或实现父类或接口。在 Java SE 16 中, Sealed Classes 依然是预览状态。

Day Period Support

详见:JDK-8247781

DateTimeFormatter 的一个新成员是日周期符号 "B",它提供了一个上午/下午格式的替代方案。

如下代码:

package git.snippets.jdk16;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter; /**
* 详见:https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/time/format/DateTimeFormatter.html
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 16
*/
public class DayPeriodTest {
public static void main(String[] args) {
LocalTime date = LocalTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("B h:m");
System.out.println(date.format(formatter));
}
}

输出下午 3:54

更多:JDK 16 DateTimeFormatter

Stream.toList()

详见:JDK-8180352

其目的是减少一些常用的流收集器的模板代码,如Collectors.toListCollectors.toSet

示例代码如下

package git.snippets.jdk16;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; /**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 16
*/
public class StreamToListMethodDemo {
public static void main(String[] args) {
List<String> integersAsString = Arrays.asList("1", "2", "3");
// before jdk 16
List<Integer> ints = integersAsString.stream().map(Integer::parseInt).collect(Collectors.toList());
// jdk 16+
List<Integer> intsEquivalent = integersAsString.stream().map(Integer::parseInt).toList();
}
}

打包工具增强

使用 jpackage 命令可以把 JAR 包打包成不同操作系统支持的软件格式,

在 Java SE 14 中是预览功能,到Java SE 16中正式启用

常见平台格式如下:

Linux 平台下为debrpm格式

MacOS 平台下为pkgdmg格式

Windows 平台下为msiexe格式

命令格式为:

jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main

要注意的是,jpackage 不支持交叉编译,也就是说在 windows 平台上是不能打包成 MacOS 或者 Linux 系统的软件格式的。

instanceof 模式匹配

在 Java SE 14 中开始作为预览功能,Java SE 16 中被正式启用

package git.snippets.jdk16;

import java.util.ArrayList;
import java.util.Arrays; /**
* instanceof
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 16
*/
public class InstanceofInJdk16 {
public static void main(String[] args) {
Object o = new ArrayList<String>();
// jdk 16
if (o instanceof ArrayList list) {
list.add("a");
} // before jdk 16
if (o instanceof ArrayList) {
ArrayList list = (ArrayList) o;
list.add("a");
}
}
}

Records

在 Java SE 15 开始作为预览功能,Java SE 16 正式启用,示例代码如下:

package git.snippets.jdk16;

/**
* Records功能
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 16
*/
public class RecordsInJava15 {
public static void main(String[] args) {
test();
} // record 是一种全新的类型,它本质上是一个 final 类,
// 同时所有的属性都是 final 修饰,它会自动编译出 public get hashcode 、equals、toString 等方法,减少了代码编写量。
private static void test() {
Cat c1 = new Cat("tomcat", 1);
Cat c3 = new Cat("tomcat", 1);
Cat c2 = new Cat("jerry", 2);
System.out.println(c1);
System.out.println(c2);
System.out.println(c1 == c3);
}
} record Cat(String name, Integer age) {
}

更多

Java SE 7及以后各版本新增特性

参考资料

JDK 16 Release Notes

New Features in Java 16

Java 16 Update: What’s New In JDK 16

Java 16 新功能介绍

Java SE 16 新增特性的更多相关文章

  1. Java SE 19 新增特性

    Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...

  2. Java SE 14 新增特性

    Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  3. Java SE 15 新增特性

    Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  4. Java SE 17 新增特性

    Java SE 17 新增特性 作者:Grey 原文地址:Java SE 17 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  5. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  6. Java SE 9 新增特性

    Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  7. Java SE 10 新增特性

    Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  8. Java SE 11 新增特性

    Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  9. Java SE 12 新增特性

    Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

随机推荐

  1. 专家PID控制仿真学习

    目录 专家控制 专家系统 专家控制 学习笔记,用于记录学习 资料:<智能控制>(第四版)--刘金琨 专家系统 一.专家系统的定义 专家系统是一类包含知识和推理的智能计算机程序,其内部包含某 ...

  2. 渗透开源工具之sqlmap安装配置环境变量教程

    由于计算机安全牵涉到很多方面,建议自己在服务器上搭建自己的靶场,如何搭建靶场请订阅并查看作者上期教程,这里作者先为大家推荐一个免费开源升级靶场:https://hack.zkaq.cn/   在封神台 ...

  3. 干货合集│最好用的 python 库都在这

    一.分词 - jieba 优秀的中文分词库,依靠中文词库,利用词库确定汉子之间关联的概率,形成分词结果 import jieba word = '伟大的中华人民共和国' jieba.cut(word) ...

  4. mac M1 php扩展 xlswriter 编译安装爬坑记录

    电脑配置 MacBook Pro(14英寸,2021年) 系统版本 macOS Monterey 12.4 芯片 Apple M1 Pro PHP环境 MAMP Pro Version 6.6.1 ( ...

  5. 手把手教你实现在Monaco Editor中使用VSCode主题

    背景 笔者开源了一个小项目code-run,类似codepen的一个工具,其中代码编辑器使用的是微软的Monaco Editor,这个库是直接从VSCode的源码中生成的,只不过是做了一点修改让它支持 ...

  6. MySQL 锁常见知识点&面试题总结

    节选自 <MySQL 常见知识点&面试题总结> 表级锁和行级锁了解吗?有什么区别? MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发 ...

  7. final关键字概念与四种用法和final关键字用于修饰类和成员方法

    fifinal关键字 概述 学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写.那么我们能不能随意的继承 API中提供的类,改写其内容呢?显然这是不合适的.为了避免这种随意改写 ...

  8. war包解压与压缩

    解压:jar -xvf ROOT.war 压缩:jar -cvfM0 ROOT.war ./

  9. 地址解析协议(ARP) 分析

    什么是ARP协议 ARP(A ddress R esolution P rotocol)- 地址解析协议 ,用于将IP地址解析为MAC地址.复杂来说,ARP用于32位IPv4地址和以太网的48位MAC ...

  10. 从零开始手写Cartographer(1): 开端

    写在前面的话 我做SLAM已经三年了.读书时初学SLAM,一开始无从下手,直到读了高博士的博客,茅塞顿开,渐入佳境.后来又买了他的<视觉SLAM十四讲>,常伴手边,直至毕业.几个月前找工作 ...