在Java中如何使用Method与Field操作类成员_Java反射API说明
发布时间 - 2026-01-21 00:00:00 点击率:次Java反射调用私有方法需先调用setAccessible(true),再invoke();读写私有字段同理,且需注意类型匹配、final字段限制及模块化访问控制。
Java 反射中 Method 和 Field 是操作类成员的核心类型,但直接用它们读写私有成员、调用方法时极易抛出 IllegalAccessException 或 IllegalArgumentException —— 根本原因不是代码写错了,而是没正确处理访问权限控制。
如何获取并调用私有方法(Method.invoke())
反射调用私有方法必须显式设置可访问性,否则即使能 getDeclaredMethod() 成功,invoke() 也会失败。
-
setAccessible(true)必须在invoke()前调用,且对每个Method实例单独设置 - 若方法有参数,传入的实参类型必须与声明类型兼容(如
int不能直接传Integer,除非自动拆箱成功) - 静态方法的第一个参数传
null;实例方法第一个参数必须是目标对象引用 - 调用返回
void的方法时,invoke()返回null,不是Void
Class> clazz = MyClass.class;
Method method = clazz.getDeclaredMethod("privateMethod", String.class);
method.setAccessible(true); // 关键一步
Object result = method.invoke(new MyClass(), "hello");
如何安全读写私有字段(Field.get()/set())
Field 的读写比 Method 更容易踩坑:字段类型不匹配、未设 setAccessible(true)、对 final 字段误写都会导致异常或静默失败。
-
getDeclaredField()才能拿到私有字段;getField()只返回 public 字段 - 读取基本类型字段(如
int)请用getInt()等专用方法,避免装箱/拆箱异常 - 修改
final字段需先用modifiers字段绕过 JVM 检查(JDK 12+ 默认禁止,需启动参数--add-opens) - 字段值为
null时,对基本类型字段调用get()会抛IllegalArgumentException
Field field = clazz.getDeclaredField("privateValue");
field.setAccessible(true);
String value = (String) field.get(instance); // 注意类型强转
field.set(instance, "new value");
为什么 getMethods() 拿不到私有方法?
getMethods() 只返回当前类及所有父类中 public 的方法(含继承的),它根本不会扫描 private / protected 方法。这是设计使然,不是 bug。
- 要获取本类所有声明的方法(含 private),必须用
getDeclaredMethods() -
getDeclaredMethods()不包含继承方法,哪怕父类是 public 方法也不会出现 - 如果需要“本类定义的所有方法 + 父类 public 方法”,得手动合并两组结果并去重
- 泛型方法的类型信息需通过
getGenericReturnType()获取,getReturnType()只返回擦除后的原始类型
性能与模块化限制(JDK 9+)
从 JDK 9 开始,模块系统默认阻止反射访问非 open 模块的内部 API,即使写了 setAccessible(true) 也会抛 InaccessibleObjectException。
- 解决办法是在运行时加 JVM 参数:
--add-opens java.base/java.lang=ALL-UNNAMED - 频繁反射调用比直接调用慢 5–50 倍,尤其涉及参数解析和访问检查时;建议缓存
Method/Field实例 -
MethodHandle是更轻量的替代方案,但无法绕过模块限制,且调试难度更高 - Android 上 ART 虚拟机对反射有额外限制,某些系统类字段可能完全不可访问

真正麻烦的从来不是“怎么写”,而是“什么时候该用”——比如序列化框架依赖反射,但业务代码里硬写 setAccessible(true) 往往意味着设计上可以暴露接口或改用策略模式。权限绕过只是手段,不是目的。
# java
# android
# access
# 虚拟机
# 为什么
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
如何在万网自助建站平台快速创建网站?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel怎么在Controller之外的地方验证数据
如何在 Pandas 中基于一列条件计算另一列的分组均值
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
nginx修改上传文件大小限制的方法
如何在腾讯云服务器快速搭建个人网站?
详解jQuery停止动画——stop()方法的使用
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何创建自定义Artisan命令?(代码示例)
,网页ppt怎么弄成自己的ppt?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
中山网站推广排名,中山信息港登录入口?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
免费视频制作网站,更新又快又好的免费电影网站?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何用y主机助手快速搭建网站?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
JavaScript如何实现错误处理_try...catch如何捕获异常?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
昵图网官方站入口 昵图网素材图库官网入口
如何快速生成ASP一键建站模板并优化安全性?
网站制作软件有哪些,制图软件有哪些?
MySQL查询结果复制到新表的方法(更新、插入)
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Python数据仓库与ETL构建实战_Airflow调度流程详解
Android使用GridView实现日历的简单功能
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
如何在搬瓦工VPS快速搭建网站?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
大连网站制作公司哪家好一点,大连买房网站哪个好?

