升级至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
相关产品推荐
相关产品推荐

