• Java SE 16 新增特性


    Java SE 16 新增特性

    作者:Grey

    原文地址:

    博客园:Java SE 16 新增特性

    CSDN: Java SE 16 新增特性

    源码

    源仓库: Github: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 Grey
     * @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";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    运行输出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 Grey
     * @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));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出下午 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 Grey
     * @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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    打包工具增强

    使用 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
    
    • 1

    要注意的是,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 Grey
     * @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");
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    Records

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

    package git.snippets.jdk16;
    
    /**
     * Records功能
     *
     * @author Grey
     * @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) {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    更多

    Java SE 7及以后各版本新增特性,持续更新中…

    参考资料

    JDK 16 Release Notes

    New Features in Java 16

    Java 16 Update: What’s New In JDK 16

    Java 16 新功能介绍

  • 相关阅读:
    小程序插件接入、开发与注意事项
    支持CT、MR三维后处理的医学PACS源码
    可视化大屏丑?这篇文章教你如何做美观大屏!
    RTI-DDS代码分析使用介绍
    浏览器中的history详解
    实战PyQt5: 144-QChart图表之水平柱状图
    VScode 右键没有转到定义等的菜单
    #【QT 整体窗口拖动大小,内部控件无法跟随改变的原因>>>>>解决:布局相关,布局设置】
    遭遇DDOS攻击忍气吞声?立刻报警!首都网警重拳出击,犯罪分子无所遁形
    首发scitb包,一个为制作统计表格而生的R包
  • 原文地址:https://blog.csdn.net/hotonyhui/article/details/126457132