jdk17的一些特性和升级遇到的问题

特性

JEP 403: Strongly Encapsulate JDK Internals,增强jdk内部元素的保护

大多数开发用不到。升级jdk时,可能因为之前代码用了某些类,导致无法升级。

JEP 394: Pattern Matching for instanceof,instanceof模式匹配(16)

jdk16提供了instanceof-and-cast语法

// Old code
if (o instanceof String) {
    String s = (String)o;
    ... use s ...
}// New code
if (o instanceof String s) {
    ... use s ...
}

JEP 395: Records(16)

JEP 395: Records

简化模型定义

record Point(int x, int y) { }

对应简化前代码

class Point {
    private final int x;
    private final int y;    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }    int x() { return x; }
    int y() { return y; }    public boolean equals(Object o) {
        if (!(o instanceof Point)) return false;
        Point other = (Point) o;
        return other.x == x && other.y == y;
    }    public int hashCode() {
        return Objects.hash(x, y);
    }    public String toString() {
        return String.format("Point[x=%d, y=%d]", x, y);
    }
}

JEP 409: Sealed Classes(17)

密封的类或接口,在父类定义中限制了具体实现类,也就是除了这里列出的实现类外,其他类无法继承或实现该抽象类或接口。

JEP 409: Sealed Classes

JEP 361: Switch Expressions(14)

JEP 361: Switch Expressions

使用->代替:,且不需要写break。

使用switch表达式之前:

int numLetters;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numLetters = 6;
        break;
    case TUESDAY:
        numLetters = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        numLetters = 8;
        break;
    case WEDNESDAY:
        numLetters = 9;
        break;
    default:
        throw new IllegalStateException("Wat: " + day);
}

使用switch表达式:

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

JEP 378: Text Blocks(15)

文本块,例如"""长文本""",省略了拼接代码。

String html = "<html>\n" +"    <body>\n" +"        <p>Hello, world</p>\n" +"    </body>\n" +"</html>\n";
使用文本块
String html = """<html><body><p>Hello, world</p></body></html>""";

JEP 358: Helpful NullPointerExceptions(14)

NPE异常描述中输出具体哪个对象是null

JEP 406: Pattern Matching for switch,switch模式匹配

JEP 406: Pattern Matching for switch (Preview)

不知道入参具体类型,需要进行分辨并输出类型。

利用jdk16的特性:

static String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}

利用jdk17的switch模式匹配特性:

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

升级java17遇到的一些问题

由通过反射访问受限的JDK内部类或字段导致

Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @7c3fdb62

原因:在Java 17中,模块系统(JPMS)变得更加严格,某些内部API和反射访问被限制。这导致了 InaccessibleObjectException 异常,因为你的代码或依赖库试图通过反射访问受限的JDK内部类或字段。

解决方案

1.避免使用反射访问受限的JDK内部类或字段:

a.尽量避免直接通过反射访问JDK内部实现。查找替代方案,使用标准Java API来实现相同的功能。

2.更新依赖库:

a.检查并更新所有第三方库,以确保它们兼容Java 17。许多流行的库已经发布了兼容Java 17的新版本。

3.使用--add-opens选项(临时解决方案):

a.如果你无法立即修改代码,可以暂时通过添加JVM参数来开放特定模块和包的访问权限,但这只是临时解决方案,不推荐长期使用。

使用--add-opens选项

你可以在运行应用程序时添加以下JVM参数:(亲测有效,有几个包出异常,就加几个)

--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED

java 17 编译失败 java: 程序包 sun.reflect.generics.reflectiveObjects 不可见

(程序包 sun.reflect.generics.reflectiveObjects 已在模块 java.base 中声明, 但该模块未将它导出到未命名模块)

原因:

在Java 17中,模块系统(JPMS)变得更加严格,某些内部API(如sun.reflect.generics.reflectiveObjects)已经被限制访问。这导致了“程序包不可见”的错误,因为你的代码或依赖库试图通过反射访问受限的JDK内部类或字段。

解决方案

1.避免使用内部API:

a.尽量避免使用sun.*包下的类和接口,因为它们是JDK的内部实现,不保证向后兼容性。

b.查找替代方案,使用标准Java API来实现相同的功能。

2.更新依赖库:

a.如果你正在使用第三方库,并且这些库依赖于内部API,请检查是否有更新版本。许多流行的库已经发布了兼容Java 17的新版本。

3.迁移到标准API:

a.如果你自己编写了代码并且依赖于这些内部API,请考虑迁移到标准Java API。例如,如果需要反射功能,可以使用java.lang.reflect包中的类。

4.临时解决方案:使用--add-exports选项:

a.如果你无法立即修改代码,可以暂时通过添加JVM参数来开放特定模块和包的访问权限,但这只是临时解决方案,不推荐长期使用。

使用--add-exports选项

你可以在运行应用程序时添加以下JVM参数:

--add-exports java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED

为了编译能通过,需要如下配置

xml
<build>
    <plugins>
        <!-- For compiling -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <fork>true</fork>
                <compilerArgs>
                    <arg>--add-exports</arg>
                    <arg>java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED</arg>
                </compilerArgs>
            </configuration>
        </plugin>    </plugins>
</build>

由javaSE不再包含javaEE的API导致

java17 java: 程序包javax.jws不存在 java: 程序包javax.xml.ws不存在

原因:

在Java 17中,javax.jws包已经被移除。这个包属于Java EE(现为Jakarta EE)的一部分,而Java SE从Java 11开始就不再包含这些API。因此,如果你的项目依赖于这些API,你需要采取一些措施来解决这个问题。

解决方案

1.添加相关依赖:

a.如果你需要使用javax.jws包,可以通过添加相应的Maven或Gradle依赖来引入这些API。

2.迁移到Jakarta EE:

a.Java EE已经迁移到Jakarta EE,你可以考虑将代码迁移到对应的Jakarta API

<dependency><groupId>javax.jws</groupId><artifactId>javax.jws-api</artifactId><version>1.1</version></dependency><dependency><groupId>javax.jws</groupId><artifactId>javax.jws-api</artifactId><version>1.1</version></dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未履行出资义务,名义股东担何责任?

名义股东是否要对未履行出资义务承担责任&#xff1f;如果要担责&#xff0c;应该承担何种责任&#xff1f;近日&#xff0c;河南省西平县人民法院审结了一起股东损害公司债权人利益责任纠纷案。   2021年&#xff0c;经生效法律文书确认&#xff0c;B实业公司应支付A科技公司…

树莓派pico入坑笔记,dht11使用及温湿度表制作

目录 关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 用到的库adafruit_dht&#xff0c;需要导入pico才能使用&#xff0c;在这里下载 样例程序 进阶玩法&#xff0c;显示信息的温湿度计 屏幕使用见树莓派pico专栏的ssd1306oled屏幕使用 代码 效…

代码随想录算法训练营第34天

LeetCode 416. 分割等和子集 链接 class Solution { public:bool canPartition(vector<int>& nums) {vector<int> dp(10001, 0);int sum accumulate(nums.begin(), nums.end(), 0);if(sum % 2 1) {return false;}int target sum / 2;for(int i 0; i <…

Go 初始化一个字典

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

4K60无缝一体矩阵 HDMI2.0功能介绍

关于GF-HDMI0808S 4K60无缝一体矩阵的功能介绍&#xff0c;由于直接针对GF-HDMI0808S型号的具体信息较少&#xff0c;我将结合类似4K60无缝HDMI矩阵的一般功能特性和可能的GF-HDMI0808系列产品的特点来进行说明。请注意&#xff0c;以下信息可能不完全针对GF-HDMI0808S型号&…

HOW - 结合 Form 和 Schema 的数据验证方案(Shema Validation)

目录 示例安装示例代码解释 Schema Validation 产生背景和机制产生背景机制ZodYup 机制和工作原理结论 在 React 应用中&#xff0c;使用表单和 Schema Validation 可以有效地管理表单状态和验证输入数据。 示例 常见的库包括 Formik 和 Yup。Formik 用于管理表单状态&#x…

springboot+vue系统开发

链接: https://pan.baidu.com/s/1P1YpHAx9QOBPxjFZ9SAbig 提取码: u6f1

如何设计一个C语言面向结构体的内存数据库

内存数据库 一般所谓内存数据库&#xff0c;是指能够与应用运行在同一个进程内的数据库&#xff0c;也就是说能够被嵌入到进程内运行的数据库。 比较著名的内存数据库软件&#xff0c;例如&#xff0c;Sqlite&#xff1b;以及新生代的NOSql key-value数据库bdb(Berkeley DB)、…

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1&#xff1a;List1、List接口特点2、List接口方法3、List接口主要实现类&#xff1a;Array…

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…

【Linux】任务管理

这个任务管理&#xff08;job control&#xff09;是用在bash环境下的&#xff0c;也就是说&#xff1a;【当我们登录系统获取bashshell之后&#xff0c;在单一终端下同时执行多个任务的操作管理】。 举例来说&#xff0c;我们在登录bash后&#xff0c;可以一边复制文件、一边查…

adb 常用的命令总结

1、adb logcat 抓取日志 adb logcat > d:\log.txt Ctrlc 结束日志抓取 adb logcat -c > d:\log.txt 清空旧日志 发生Native Crash 时&#xff0c;抓取错误报告 adb logcat -b crash 抓取筛选后的日志&#xff1a; adb logcat -s AndroidRuntime > d:\log…

解析Java中1000个常用类:EnumSet类,你学会了吗?

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

CSS 单位中 px、em 和 rem 的区别?

在CSS中&#xff0c;px、em和rem是常用的长度单位&#xff0c;它们之间有一些区别&#xff1a; px&#xff08;像素&#xff09;&#xff1a; px是相对长度单位&#xff0c;它是相对于显示器屏幕分辨率的一个点的大小。 px单位是固定的&#xff0c;不会随着父元…

代码随想录算法训练营第五十二天(图论)| 98. 所有可达路径、深度优先搜索、广度优先搜索

邻接矩阵 邻接矩阵是一种使用二维数组来表示图的方法。矩阵中的元素表示节点之间是否存在边。如果存在边&#xff0c;则对应的矩阵元素为1&#xff08;或边的权重&#xff09;&#xff1b;否则为0。 特点&#xff1a; 空间复杂度高&#xff1a;无论图是否稀疏&#xff0c;邻…

前端Canvas入门——一些注意事项

创建渐变的三种方法&#xff1a; createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变&#xff08;放射性渐变&#xff09; createConicGradient() - 锥形渐变 这三种的核心观点都是&#xff1a; 创建一个gradient对象&#xff0c;然后调用addColorStop()方法…

【java】力扣 合并两个有序链表

文章目录 题目描述题目链接思路代码 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题目链接 21. 合并两个有序链表 思路 先定义一个哨兵节点dummy&#xff0c;为了方便解题 然后定义一个节点pre&#xff0…

paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境

1.安装英伟达显卡驱动 首先需要到NAVIDIA官网去查自己的电脑是不是支持GPU运算。 网址是&#xff1a;CUDA GPUs | NVIDIA Developer。打开后的界面大致如下&#xff0c;只要里边有对应的型号就可以用GPU运算&#xff0c;并且每一款设备都列出来相关的计算能力&#xff08;Compu…

模板方法模式的实现

1. 引言: 交易管理系统中的模板方法模式 之前做过一个交易管理系统&#xff0c;其中有一个核心模块是“交易流程管理”&#xff0c;该模块需要处理不同类型的交易&#xff0c;比如期货交易、期权交易和股票交易。在构建交易管理系统的过程中&#xff0c;我们面临了一个核心挑战…

为二进制文件添加.gnu_debugdata调试信息

前言 在使用gcc/g编译二进制文件过程中&#xff0c;如果添加了-g参数&#xff0c;编译出来的二进制文件会带有debug信息&#xff0c;供调试使用。但是debug信息往往占用空间很大&#xff0c;导致二进制文件太大&#xff0c;在发布到生产环境时&#xff0c;一般会去掉调试信息&…