首页 > 编程语言 >java.lang.reflect.InaccessibleObjectException

java.lang.reflect.InaccessibleObjectException

时间:2024-03-05 17:58:34浏览次数:24  
标签:lang java module reflect base 模块 Java InaccessibleObjectException

低版本springboot应用使用高版本JDK报以下异常:

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @7a79be86

这个错误是由于Java的模块化系统引入的安全限制导致的。在Java 9及之后的版本中,模块系统对反射访问进行了限制,以防止对核心Java类的不安全访问。

错误消息 java.lang.reflect.InaccessibleObjectException 指出,尝试通过反射访问 java.lang.ClassLoaderdefineClass 方法时失败了,因为 java.base 模块没有向你的应用程序所在的未命名模块(unnamed module)开放 java.lang 包。

解决方案:
1.升级依赖库:确保你使用的所有依赖库都是最新的,并且与你的Java版本兼容。有时,库的新版本可能已经解决了与Java模块化系统的兼容性问题。
2.使用 --add-opens JVM参数:在运行应用程序时,你可以使用 --add-opens JVM参数来显式地打开必要的模块和包。例如,为了允许反射访问 java.lang 包,你可以这样运行你的应用程序:

java --add-opens java.base/java.lang=ALL-UNNAMED -jar [your-application.jar]

说明:
这个命令会告诉JVM允许所有未命名的模块(ALL-UNNAMED)通过反射访问 java.base 模块中的 java.lang 包。请注意,使用 --add-opens 参数是一种临时的解决方案,通常只用于开发和测试,而不是生产环境,因为它可能会破坏Java的模块化封装和安全性。
在开发过程中,你应该尽量避免需要这种访问的情况,或者寻找其他不依赖于反射的解决方案。如果确实需要这样做,请确保你了解相关的安全风险,并在生产环境中仔细评估。

3.使用Java 8:如果你的项目不需要Java 9或更高版本的功能,并且受模块化系统的影响较大,你可以考虑使用Java 8,它不受这些限制的影响。
4.更新应用程序模块描述符:如果你的应用程序是一个模块化的应用程序(使用了 module-info.java 文件),你可以尝试在模块描述符中添加 requires 语句来明确要求对 java.base 模块的访问。例如,如果你的模块依赖于 java.sql 模块来访问数据库功能,你可以在 module-info.java 文件中这样写:

module my.module {  
    requires java.sql;  
      
    // 其他指令,如 exports, opens, uses 等  
}

在这个例子中,my.module 是你的模块名称,requires java.sql; 表示 my.module 依赖于 java.sql 模块。

对于 java.base 模块,由于它是所有模块隐式依赖的,你不需要添加任何 requires 语句。如果你尝试添加 requires java.base; 到你的 module-info.java 文件中,编译器会忽略这个语句,因为它没有实际作用。

标签:lang,java,module,reflect,base,模块,Java,InaccessibleObjectException
From: https://www.cnblogs.com/lisong0626/p/18054551

相关文章

  • 理解LLMOps: Large Language Model Operations
    理解LLMOps:LargeLanguageModelOperations对于像我一样的小白来说,本文是一篇非常不错的LLMs入门介绍文档。来自:UnderstandingLLMOps:LargeLanguageModelOperations本文首先解释了新术语"LLMOps"及其背景,然后讨论使用LLMs和传统ML模型构建AI产品的不同之处,并基于这些......
  • Reflect
    Reflect是一个为了替代Object的新语法现阶段,某些方法同时在Object和Reflect身上部署,但是未来的新方法将只部署在Reflect身上让Object操作都变成函数行为,某些Object操作是命令式的,比如nameinobj和deleteobj[name],而Reflect.has(obj,name)和Reflect.deleteProperty(obj,nam......
  • 接口测试-json文件读取报java.lang.ClassCastException: java.util.LinkedHashMap can
    问题原因:从json文件中读取的信息为hashMap,与预期(类对象)格式不匹配,无法解析。问题分析:json文件包含一个json串列表,代表向接口中传递不同的参数组合,通过下面方法读取json文件信息,反序列化成类对象,并把这些赋值的对象进行接口请求参数进行传递。publicList<T>getReadValuesLi......
  • LangChain |Agent
    Agent参考:LangChain实战:Agent思维大模型是被训练出来的,知识是有时间限制的,所以当进行问答时,可以结合本地知识库和调用搜索或在线API来增强自身能力,这些不属于大模型的内部数据,成为外部工具。LangChain提供了Agent(代理)模块,大模型以此可以调用外部工具。Agent是什么?当大模......
  • P9184 [USACO23OPEN] Moo Language B 题解
    恶♂趣♂味♂大♂模♂拟♂。首先是构造语句部分:开始肯定是尽可能地多用上不及物语句和及物语句;接着,因为及物语句的单词数量一定比不及物语句多,所以贪心地尽可能多地将不及物语句改为及物语句;然后,为了增加语句长度,再次贪心地在及物语句中尽可能多地添加名词和逗号即可。......
  • CF1915D Unnatural Language Processing 题解
    容易发现音节的划分不仅要求子串形如\(\texttt{CV}\)或\(\texttt{CVC}\),并且接下来的两个字符也必须是\(\texttt{CV}\),不然会导致无法划分下去。于是我们遍历字符串,找出所有满足上述条件的子串,记录需要输出\(\texttt{.}\)的位置即可。实现:intn;strings,ans,t="";cin>......
  • golang中员工分组分页获取的一种方案
    在业务中,有一个场景,A系统需要提供一个接口,返回组织架构信息,供B系统入库,即B系统的组织架构是从A系统中同步过来的。这个场景下存在一个小问题,B系统期望A系统按照组织树层序遍历分页返回。这样B系统就不需要担心新增组织时找不到父级组织了。那么A系统要怎么做呢?方案1:在数据库......
  • golang wire依赖注入
    安装gogetgithub.com/google/wire/cmd/wire@latest一.假设需要定义多个有依赖的启动项,新建main.gopackagemainimport("fmt")typeMessagestringfuncNewMessage()Message{returnMessage("Hithere!")}typeEventstruct{GreeterGreeter}......
  • golang中关于map的value类型定义为函数类型时(方法值)的一点点思考
    文章的内容仅仅是自己关于map的value类型定义为函数类型时的一点点思考,如有不对的地方,请不吝赐教。学习过后才知道叫做方法值。1、起因最近在看老项目代码时,看到了一段类似于下面的定义,最开始看到的时候,对于LotMap的用法比较疑惑,为什么mapvalue定义的函数类型是func(r......
  • Hudi-FlinkSQL导入数据报错:[ERROR] Could not execute SQL statement. Reason: java.l
    问题描述通过FlinkSQL创建Hudi表后,向表中插入数据报错:[ERROR]CouldnotexecuteSQLstatement.Reason:java.lang.ClassNotFoundException:org.apache.hadoop.fs.FSDataInputStream 解决办法向Hudi表中写入数据时,会调用Hadoop的Jar包,但是Flink的lib目录中没有该Jar包。......