加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java SE 16 新增特性

发布时间:2023-04-17 11:35:56 所属栏目:教程 来源:
导读:作为对接口中默认方法的增强,随着 Java SE 16 的发布,java.lang.reflect.InvocationHandler可以通过使用反射调用接口的默认方法。

参考如下示例

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

参考如下示例

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:">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;
/**
 * @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.toList和Collectors.toSet。

示例代码如下

package git.snippets.jdk16;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author <a href="mailto:">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:">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:">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) {
}

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章