news 2026/8/2 18:01:23

482. Java 反射 - 访问私有方法 泛型擦除的影响

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
482. Java 反射 - 访问私有方法 泛型擦除的影响

文章目录

  • 482. Java 反射 - 访问私有方法 & 泛型擦除的影响
    • 1. 访问私有方法 (Accessing Private Methods)
      • 直接调用的问题
      • 解决办法:`setAccessible(true)`
      • 输出结果:
    • 2. 泛型与类型擦除 (Generics and Type Erasure)
      • 错误示例
      • 正确示例
    • 3. 总结

482. Java 反射 - 访问私有方法 & 泛型擦除的影响


1. 访问私有方法 (Accessing Private Methods)

直接调用的问题

如果你在类外部通过反射尝试调用一个private 方法,会抛出IllegalAccessException

classUser{privatevoidsecret(){System.out.println("Top Secret!");}}
User user = new User(); Method secretMethod = User.class.getDeclaredMethod("secret"); secretMethod.invoke(user); // ❌ 会抛 IllegalAccessException

解决办法:setAccessible(true)

我们可以通过关闭访问检查来绕过限制:

secretMethod.setAccessible(true);// 关闭 Java 语言访问检查secretMethod.invoke(user);// ✅ 正常执行

输出结果:

TopSecret!

📌注意点

  • setAccessible(true)只是关闭了访问控制检查,它不会改变方法的修饰符
  • Java 模块系统(Java 9+)下,如果类属于其他模块,且模块没有开放包,调用可能依然会失败(需要--add-opens)。

2. 泛型与类型擦除 (Generics and Type Erasure)

在 Java 中,泛型是编译期特性,运行时会发生类型擦除
这意味着:反射看到的其实是擦除后的类型,而不是源代码中的泛型。


错误示例

List<String>strings=newArrayList<>();Class<?>clazz=strings.getClass();// ❌ 尝试获取 add(String) 方法MethodaddString=clazz.getMethod("add",String.class);

运行结果:

Exceptionin thread"main"java.lang.NoSuchMethodException:java.util.ArrayList.add(java.lang.String)

📌原因

  • ArrayList<E>.add(E e)在运行时擦除为ArrayList.add(Object o)
  • 所以找不到参数是String.class的方法

正确示例

List<String>strings=newArrayList<>();Class<?>clazz=strings.getClass();// ✅ 使用 Object.class 才能找到 add()MethodaddObject=clazz.getMethod("add",Object.class);addObject.invoke(strings,"Hello Reflection!");System.out.println(strings);

输出结果:

[HelloReflection!]

📌注意点

  • 反射操作是基于擦除后的类型,因此需要用Object.class
  • 这样会失去泛型带来的类型安全(你甚至可以通过反射往List<String>里塞一个Integer)。

3. 总结

  • 私有方法
    • 默认不可访问 → 需要setAccessible(true)
    • 在模块化环境中可能需要--add-opens
  • 泛型与擦除
    • 编译期有泛型,运行期被擦除
    • 反射看到的参数类型通常是Object
    • 使用反射会丢失泛型检查,可能破坏类型安全
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 17:57:31

从电竞转会决策看团队构建:如何系统化评估与引进人才

1. 从“AL官宣呼吸加盟”看转会期的决策逻辑最近电竞圈里关于选手转会的消息总能引起不少讨论&#xff0c;比如“AL官宣呼吸加盟”和“BLG不要盲目引进圣枪哥”这两个话题。表面上看&#xff0c;这是两支队伍的人员变动&#xff0c;但背后反映的是一个更普遍的问题&#xff1a;…

作者头像 李华
网站建设 2026/8/2 17:56:30

靠谱的桐城整装老牌装修公司

开篇引入咱桐城人&#xff0c;生活在这充满文都文化气息的地方&#xff0c;随着周边六安、安庆等地房价的动态变化&#xff0c;咱桐城的新房交付也越来越多啦。不少朋友买了新房&#xff0c;想着要和老人孩子一起同住&#xff0c;打造一个温馨的家。然而呀&#xff0c;装修难、…

作者头像 李华
网站建设 2026/8/2 17:52:14

校园网环境下Windows系统定时开机、自动登录与联网认证全自动方案

1. 项目缘起&#xff1a;一个“懒人”的桌面自动化构想作为一名在校园里摸爬滚打多年的“老油条”&#xff0c;我每天到实验室的第一件事&#xff0c;就是按下电脑的电源键&#xff0c;然后等待漫长的启动过程。开机后&#xff0c;手动输入Windows密码登录&#xff0c;接着还得…

作者头像 李华
网站建设 2026/8/2 17:51:50

Unity游戏开发中FGUI集成实战:从环境搭建到性能优化全流程解析

1. 项目概述与核心价值最近在社区里看到不少朋友在讨论Unity的UI方案选择&#xff0c;从传统的UGUI到新兴的UI Toolkit&#xff0c;再到一些第三方插件&#xff0c;选择确实不少。我自己在多个商业项目中深度使用了FGUI&#xff08;FairyGUI&#xff09;&#xff0c;尤其是在需…

作者头像 李华
网站建设 2026/8/2 17:48:04

Handy:彻底改变数字时代的本地化AI语音转文本革命

Handy&#xff1a;彻底改变数字时代的本地化AI语音转文本革命 【免费下载链接】Handy A free, open source, and extensible speech-to-text application that works completely offline. 项目地址: https://gitcode.com/GitHub_Trending/handy11/Handy 在数据隐私日益重…

作者头像 李华
网站建设 2026/8/2 17:45:03

从网络证书切换看高可用系统设计:核心架构与可靠性实践

1. 从一个“重启”提示说起&#xff1a;切换系统的本质是什么&#xff1f; 最近在排查一个线上服务异常时&#xff0c;遇到了一个很有意思的提示&#xff1a;“检测到系统网络证书缺失&#xff0c;可以切换到内置证书&#xff0c;切换需重启”。这个看似简单的提示&#xff0c;…

作者头像 李华