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

升级至JDK19后,Method类getDeclaredFields返回空的问题咨询

JDK19中Method.getDeclaredFields()返回空的原因及解决办法

原因

从JDK9开始引入了模块系统,java.lang.reflect.Method属于java.base模块,该模块的内部字段默认被强封装,外部代码无法通过反射直接访问。而JDK8没有模块系统,反射可以无限制访问类的所有已声明字段,所以能正常返回结果。

JDK16之后还进一步收紧了反射访问控制,就算调用setAccessible(true)也没法直接访问模块内的封装字段,必须显式打开模块的访问权限才行。

解决办法

要在JDK19中获取Method类的已声明字段,得通过添加JVM启动参数来开放反射访问权限:

方法1:添加--add-opens启动参数

运行程序时加上以下JVM参数:

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

这个参数的作用是把java.base模块里的java.lang.reflect包对外开放,允许你的普通应用代码(属于未命名模块)进行反射访问。

方法2:模块化项目配置(如果你的代码是模块化的)

如果你的项目是模块化的(有module-info.java),可以在该文件里添加:

requires java.base;
opens 你的模块名 to java.lang.reflect;

不过这种方式更适合正规的模块化项目,普通应用用方法1更简单直接。

验证效果

加上参数后再运行你的代码,就能看到Method类的所有已声明字段,比如declaringClass、modifiers、name、parameterTypes这些字段都会正常输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:17:08