You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX模块化TableView取值报IllegalAccessException权限异常问题

问题根因

这是Java 9+引入模块化系统(JPMS)强封装规则触发的典型运行时错误,和实体类属性定义、后台数据加载逻辑没有关联:

  • 你已经验证过后台Task返回的ObservableList<Artists>数据输出正常,实体类也按规范用了JavaFX标准属性类型,说明业务逻辑链路不存在问题
  • PropertyValueFactory是归属javafx.base模块的工具类,它需要通过深度反射访问你业务模块(MusicUI)中sample.model包下的Artists类的属性、方法,才能完成Table列与实体字段的映射绑定
  • 根据JPMS的默认规则,业务模块的包默认不对其他模块开放反射访问权限,即使类、方法都是public修饰,没有显式声明开放范围的情况下,javafx.base模块的反射访问会直接被JVM拦截,抛出被RuntimeException包裹的IllegalAccessException,也就是日志中显示的模块访问权限不足的报错

很多开发者参考旧方案修改实体类属性类型后问题依然复现,本质就是只调整了业务层代码,没有处理跨模块反射的权限边界问题。

解决方案

根据项目的运行模式选择对应的修复方式即可:

  • 保持JPMS模块化运行的推荐方案:
    1. 找到项目中位于源码根目录下的module-info.java模块声明文件
    2. 在对应模块的声明块中,添加针对实体类包的开放权限声明:opens sample.model to javafx.base;
    3. 如果项目中还有其他包含实体类、会被Table列绑定的包(比如sample.vo、sample.entity),需要将这些包也按同样格式逐一声明开放给javafx.base,否则绑定对应实体类的Table列依然会触发相同报错
  • 非模块化运行的临时方案:
    直接移除项目中的module-info.java文件,让项目以类路径模式运行,这种模式下没有跨模块的强反射封装限制,PropertyValueFactory可以正常访问业务类,不会触发权限拦截。但这种方式不符合Java高版本的模块化最佳实践,仅适合快速调试使用。

内容的提问来源于stack exchange,提问作者Nitin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 15:57:00