junit 异常错误:无法使字段成为私有的final java.lang,对象java.util,可选,可访问的值:

c90pui9n  于 2022-11-11  发布在  Java
关注(0)|答案(1)|浏览(672)
java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Object java.util.Optional.value accessible: module java.base does not "opens java.util" to unnamed module @6b26e945

我在运行JUnit代码时遇到了这个错误。错误出现在以下代码块周围。

Optional<RolesDTO> roleDTOEmployee = roles.stream()
        .filter(r -> r.getName().equals(RolesEnum.valueOf(roleName).getRoleName())).findFirst();

if (logger.isInfoEnabled()) {
    logger.info("roleDTOEmployee {}", gson.toJson(roleDTOEmployee));
}

堆栈跟踪:

at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:157)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
    at com.google.gson.Gson.getAdapter(Gson.java:423)
    at com.google.gson.Gson.toJson(Gson.java:661)
    at com.google.gson.Gson.toJson(Gson.java:648)
    at com.google.gson.Gson.toJson(Gson.java:603)
    at com.google.gson.Gson.toJson(Gson.java:583)

删除logger.info()后,代码JUnit运行得很好。我想了解这种行为。有没有解决办法,这样我就不必删除logger了。

wqlqzqxt

wqlqzqxt1#

如果您使用的是更高版本的JDK(8+)和其中一个模块(在这种情况下,com.google.gson.Gson与更低版本的JDK兼容),通常会抛出此错误。
您可以检查JDK版本和Gson版本吗如果可能和需要,请降级您的JDK。这样您的错误可能会消失。另一种可能是升级com.google.gson.Gson版本,使其与您的JDK兼容。
另一种解决方法(通常不建议使用)是传递VM参数以避免上述错误:

-Xmx1536M --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED

相关问题