首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将java项目从JDK11更新为JDK17时发出

将java项目从JDK11更新为JDK17时发出
EN

Stack Overflow用户
提问于 2022-09-07 10:55:27
回答 1查看 181关注 0票数 1

我有一个使用jdk11的java项目。我需要将项目迁移到java 17,但是集成测试已经开始失败。一旦升级到JDK17,我就开始出现以下错误:

代码语言:javascript
复制
java.lang.reflect.InaccessibleObjectException: Unable to make private sun.reflect.generics.repository.FieldRepository java.lang.reflect.Field.getGenericInfo() accessible: module java.base does not "opens java.lang.reflect" to unnamed module @5702b3b1

我也收到了java.util的错误,但是使用下面的命令行代码修复了这个错误。

我尝试添加命令行选项,如下所示,但是测试仍然失败。

代码语言:javascript
复制
                <argLine>
                    --illegal-access=permit
                    --add-opens java.base/java.lang=ALL-UNNAMED
                    --add-opens java.base/sun.reflect=ALL-UNNAMED
                    --add-opens java.base/java.util=ALL-UNNAMED
                </argLine>

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2022-09-11 13:34:35

您可以将您的方法传递到以下内容:

代码语言:javascript
复制
public static <T extends AccessibleObject> T forceAccessible(T o) {
    try {
        Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
        unsafeField.setAccessible(true);
        Unsafe unsafe = (Unsafe) unsafeField.get(null);

        Method m = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
        m.setAccessible(true);
        Field override = ((Field[]) m.invoke(AccessibleObject.class, false))[0];

        if (!o.isAccessible()) {
            try {
                o.setAccessible(true);
            } catch (InaccessibleObjectException e) {
                unsafe.putBoolean(o, unsafe.objectFieldOffset(override), true);
            }
        }
    } catch (Exception e) {}
    return o;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73634283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档