Java SE 16 新增特性
Java SE 16 新增特性
作者:Grey
原文地址:Java SE 16 新增特性
源码
镜像仓库: 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
Stream.toList()
详见:JDK-8180352
其目的是减少一些常用的流收集器的模板代码,如Collectors.toList和Collectors.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 平台下为deb和rpm格式
MacOS 平台下为pkg和dmg格式
Windows 平台下为msi和exe格式
命令格式为:
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 16 Update: What’s New In JDK 16
Java SE 16 新增特性的更多相关文章
- Java SE 19 新增特性
Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 15 新增特性
Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 17 新增特性
Java SE 17 新增特性 作者:Grey 原文地址:Java SE 17 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 8 新增特性
Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 9 新增特性
Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 10 新增特性
Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 11 新增特性
Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 12 新增特性
Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
随机推荐
- 如何把你的 Android 使用得像 Linux
前言 最近在学校里上课,老师讲的东西又听不进去,手里只有一个手机和一个平板,之前还可以用 ssh 连接云服务器玩点东西,但是我是用的软件 Juice ssh 并不是很友好,退出到后台一段时间后竟然会自 ...
- Vue自定义组件之v-model的使用
自定义组件之v-model的使用 v-model的语法糖可以为下面v-bind && @input联合完成: <input v-model="text"> ...
- conda install和pip install区别
conda ≈ pip(python包管理) + virtualenv(虚拟环境) + 非python依赖包管理 级别不一样conda和yum比较类似,可以安装很多库,不限于Python.conda是 ...
- 【Linux系列】-Linux中用shell脚本从SFTP服务器下载文件
银企直连的电子回单接口中,部分银行使用sftp服务作为文件服务器,通常只保留N天的文件内容,企业未在规定的时间范围下载文件之后就不能下载了,那么有一个自动下载的脚本岂不美滋滋. Linux安装SFTP ...
- 慢到不能忍?别忍了,Ubuntu 21.10 APT 源修改为华为云镜像源
更新记录 2022年4月15日:本文迁移自Panda666原博客,原发布时间:2021年3月29日. 2022年4月15日:将源改为华为云,华为云更方便.Ubuntu从20.04更新到21.10. 切 ...
- 25.MYsql数据库管理
MYsql数据库管理 目录 MYsql数据库管理 数据库基本操作 库和表 常用的数据类型 查看数据表结构 查看当前服务器的数据库 查看数据库中包含的表 查看表的结构 SQL语句 创建及删除数据库和表 ...
- SAP BPC 清除CUBE 中的数据
原理:先根据模型和查询条件取出数据,然后把金额设置为0,再写回CUBE. 1.获取数据并清空金额 *&--------------------------------------------- ...
- kali渗透测试阅读目录
一.渗透测试介绍 渗透测试介绍及渗透环境配置 二.信息收集 kali 信息收集 三.漏洞扫描 kali 漏洞扫描 四.漏洞利用 kali msf漏洞利用
- salt stack安装与使用
SaltStack除了传统的C/S架构外,其实还有Masterless架构,如果采用Masterless架构,我不需要单独安装一台SaltStack Master机器,只需要在每台机器上安装Minio ...
- 10道不得不会的JavaEE面试题
10道不得不会的 JavaEE 面试题 我是 JavaPub,专注于面试.副业,技术人的成长记录. 以下是 JavaEE 面试题,相信大家都会有种及眼熟又陌生的感觉.看过可能在短暂的面试后又马上忘记了 ...