如何通过Java反射调用私有Map类型成员的size()方法?
问题根因
- 你获取到的
Field对象是类字段的元数据描述对象,并不等价于类实例中该字段存储的实际值,因此直接将Field强转为Map必然失败。 getDeclaredClasses()的作用是获取类内部定义的嵌套类、内部类,和成员字段完全无关,返回0属于正常结果,说明你的Holder类没有定义内部类。
以上均属于API使用错误,和Java反射的能力上限无关,Java原生反射完全支持读取私有成员的值。
原生反射实现步骤
不需要修改字段的访问权限,按照以下步骤即可读取私有Map的size:
- 获取目标字段的
Field元数据对象 - 调用
setAccessible(true)绕过私有访问权限校验 - 调用
Field.get(目标类实例)获取该字段存储的实际值 - 强转为对应Map类型后调用
size()方法
示例代码:
// 假设holderInstance是你要读取的Holder类的实例对象 Field eTmF = Holder.class.getDeclaredField("eTM"); // 绕过private访问校验,仅对当前反射调用生效,不会修改类的原有访问修饰符 eTmF.setAccessible(true); Map<Character, String> actualETM = (Map<Character, String>) eTmF.get(holderInstance); int mapSize = actualETM.size();
如果该字段是静态字段,get()方法传入null即可。
简化反射操作的工具类
现有很多封装好的反射工具类可以简化代码,不需要手动处理异常和权限校验:
- Spring框架自带的
ReflectionUtils:封装了字段查找、权限设置、异常转译等逻辑,适合Spring生态项目使用 - Apache Commons Lang包的
FieldUtils:提供了直接读取字段值的静态方法,无需手动操作Field对象
内容的提问来源于stack exchange,提问作者MiB
相关产品推荐
相关产品推荐

