Java Weka调用CSVSaver转换arff为csv时报InaccessibleObjectException怎么办
问题原因
该异常由Java 9及以上版本引入的Java平台模块化系统(JPMS)的权限限制导致。你所使用的Weka版本内部依赖反射机制调用ClassLoader的defineClass方法完成类注入逻辑,而Java 9之后默认禁止未授权代码反射访问java.lang包下的核心类方法,因此触发了InaccessibleObjectException。
你贴出的代码逻辑本身没有错误,无需调整代码内容,仅需要做环境适配即可解决问题。
解决方案
- 方案1:降级JDK版本
最简单的适配方案是将本地开发环境的JDK版本降级到1.8(Java 8),该版本没有模块化权限限制,Weka所有常规功能都可以正常运行,不需要额外配置。 - 方案2:添加JVM启动参数(不降级Java版本)
如果你必须使用Java 9及以上版本,可以在运行程序时添加JVM启动参数,主动开放java.lang包的访问权限给未命名模块:
如果你使用IDEA、Eclipse等IDE运行代码,找到对应运行配置的「VM options」输入框,将上述参数粘贴进去即可生效。--add-opens java.base/java.lang=ALL-UNNAMED - 方案3:升级Weka版本
Weka官方在3.9.6及以上的稳定版本中已经修复了高版本Java的兼容问题,你可以将项目依赖的Weka包升级到对应版本,也可以解决该反射权限异常。
内容的提问来源于stack exchange,提问作者javaontp
相关产品推荐
相关产品推荐

