无法使字段静态最终 java.lang.invoke.MethodHandles$Lookup java.lang.invoke.MethodHandles$Lookup.IMPL_LOOKUP

Posted

技术标签:

【中文标题】无法使字段静态最终 java.lang.invoke.MethodHandles$Lookup java.lang.invoke.MethodHandles$Lookup.IMPL_LOOKUP【英文标题】:Unable to make field static final java.lang.invoke.MethodHandles$Lookup java.lang.invoke.MethodHandles$Lookup.IMPL_LOOKUP 【发布时间】:2021-11-26 05:55:29 【问题描述】:

我有一个 Spring Feign 客户端,它使用 POST 将 POJO 对象发送到远程端点,我的应用程序启动失败,出现以下异常。

java.lang.reflect.InaccessibleObjectException: 可访问:模块 java.base 不“打开 java.lang .invoke" 到未命名的模块 @420a85c4

Below the dependencies I am using in my application.
java version: 17
spring boot version: 2.5.3
spring boot cloud version: 2020.0.3
spring boot starter openfeign version: 2.2.8.RELEASE

As recommended in  https://github.com/OpenFeign/feign/issues/935, I had tried
workaround solution: Adding this jvm option '--add-opens java.base/java.lang.invoke=ALL- 
UNNAMED' worked. 

非常欢迎除 jvm 参数之外的任何其他替代建议。

【问题讨论】:

我在使用 Spring Feign 客户端的 Open JDK 17 上遇到了同样的问题 【参考方案1】:

强制 OpenFeign 版本至少为 11.7,这解决了这个issue。

如果您使用的是 Spring 依赖管理插件,那么您可以这样做(Gradle 示例):

    dependencyManagement 
        dependencies 
            dependencySet(group: 'io.github.openfeign', version: '11.7') 
                entry 'feign-core'
                entry 'feign-jackson'
                entry 'feign-slf4j'
                entry 'feign-soap'
                entry 'feign-jaxb'
            
        
    

【讨论】:

【参考方案2】:

对我来说,添加以下 JVM 选项很有效:

--add-opens java.base/java.lang.invoke=ALL-UNNAMED

【讨论】:

以上是关于无法使字段静态最终 java.lang.invoke.MethodHandles$Lookup java.lang.invoke.MethodHandles$Lookup.IMPL_LOOKUP的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用 Java 反射更改私有静态最终字段

通过对象访问时,静态最终字段和在声明时初始化的实例最终字段之间的差异[重复]

Java:使所有字段成为最终字段或可变字段?

关于字段的私有静态最终关键字的快速 Java 问题

这是啥意思:可序列化的类没有声明一个静态的最终 serialVersionUID 字段? [复制]

Applet(不声明 long 类型的静态最终 serialVersionUID 字段)