当前位置: 首页 > ai >正文

【Java 反射的使用】

系列文章目录

Java知识点


文章目录

  • 系列文章目录
  • 👉前言
  • 👉一、使用方法
    • 👉1-1、获取类的 Class 对象
    • 👉1-2、操作构造方法
    • 👉1-3、操作字段(Field)
    • 👉1-4、操作方法(Method)
  • 👉二、注意事项
  • 👉壁纸分享
  • 👉总结


👉前言

反射(Reflection)是 Java 提供的一种动态操作类、对象、方法和属性的机制。通过反射,可以在运行时获取类的元数据(如类名、方法、字段等),并动态调用对象的方法或修改字段的值,而无需在编译时确定具体类型。

反射的原理

  1. Class 对象与元数据
    JVM 在加载类时,会为每个类生成一个唯一的 Class 对象,存储类的元数据(如方法、字段、构造方法等)。
    反射 API(如 getMethod, getField)通过访问 Class 对象中的元数据实现动态操作。

  2. 动态调用机制
    方法调用通过 Method.invoke() 实现,本质是 JVM 内部通过方法指针(类似 C++ 的虚函数表)定位方法地址。
    字段访问通过 Unsafe 类或直接内存操作实现。

  3. 性能损耗来源
    反射调用需要动态解析类信息、权限检查、方法调用优化(如 JIT 编译前的解释执行)。

博客将会介绍如何实现Java 反射的使用方法。希望这篇博客对Unity的开发者有所帮助。
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.下面就让我们进入正文吧 !


提示:以下是本篇文章正文内容,下面案例可供参考

👉一、使用方法

👉1-1、获取类的 Class 对象

反射的核心是 Class 对象,所有反射操作都基于此。获取 Class 对象的方式有三种:

  1. 类名.class:
Class<?> clazz = String.class;
  1. 对象.getClass():
String str = "Hello";
Class<?> clazz = str.getClass();
  1. Class.forName()(最常用):
Class<?> clazz = Class.forName("java.lang.String");

👉1-2、操作构造方法

  1. 获取构造方法:
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); // 指定参数类型
  1. 创建实例:
Object instance = constructor.newInstance("Hello");

👉1-3、操作字段(Field)

  1. 获取字段:
Field field = clazz.getDeclaredField("fieldName"); // 获取字段(包括私有)
  1. 访问或修改字段值:
field.setAccessible(true); // 解除私有字段的访问限制
field.set(instance, "newValue"); // 修改值
Object value = field.get(instance); // 获取值

👉1-4、操作方法(Method)

  1. 获取方法:
Method method = clazz.getDeclaredMethod("methodName", int.class); // 方法名 + 参数类型
  1. 调用方法:
method.setAccessible(true); // 若方法是私有的
Object result = method.invoke(instance, 123); // 调用并传参

👉二、注意事项

  1. 性能问题
    反射操作比直接调用慢,频繁调用时需谨慎。
    优化方案:缓存 Class、Method、Field 等对象,避免重复解析。

  2. 安全限制
    反射可以突破访问权限(如调用私有方法),但可能破坏封装性。
    安全策略:通过 SecurityManager 限制反射权限。

  3. 兼容性问题
    反射依赖类名、方法名等字符串,若类结构变更(如方法重命名),反射代码会直接报错(如 NoSuchMethodException)。

  4. 模块化系统(Java 9+)
    在模块化项目中,默认禁止反射访问其他模块的非导出类。
    解决方案:在 module-info.java 中添加 opens 语句开放包访问权限。

  5. 单例模式破坏
    反射可以绕过私有构造方法创建实例,破坏单例模式。
    防御方案:在构造方法中增加防御逻辑,如:

private Singleton() {if (instance != null) {throw new IllegalStateException("单例已存在!");}
}

请添加图片描述

反射是 Java 动态能力的核心,但需谨慎使用。在明确需求且无替代方案时,合理利用反射可以大幅提升灵活性;滥用则会导致性能下降、代码可维护性降低。

典型应用场景

  1. 框架开发(如 Spring 的依赖注入、MyBatis 的 ORM 映射)。

  2. 动态代理(如 Proxy.newProxyInstance())。

  3. 注解处理器(如 Lombok 通过反射生成代码)。


👉壁纸分享

在这里插入图片描述

👉总结

本次总结的就是Java 反射的使用方法, 有需要会继续增加功能
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

http://www.xdnf.cn/news/7652.html

相关文章:

  • (T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
  • Python训练营---Day31
  • 大模型幻觉
  • CAN总线
  • mbed驱动st7789屏幕-硬件选择及连接(1)
  • TDengine 更多安全策略
  • (二十四)Java网络编程全面解析:从基础到实践
  • 基于python的花卉识别系统
  • Playwright+Next.js:实例演示服务器端 API 模拟新方法
  • 从私有化到容器云:iVX 研发基座的高校智慧校园部署运维全解析
  • 多头注意力机制和单注意力头多输出的区别
  • 大型商业综合体AI智能保洁管理系统:开启智能保洁新时代
  • 麒麟系统编译osg —— 扩展篇
  • 02 if...else,switch,do..while,continue,break
  • DevExpressWinForms-XtraMessageBox-定制和汉化
  • 【python进阶知识】Day 31 文件的规范拆分和写法
  • vLLM框架高效原因分析
  • IntentUri页面跳转
  • 常见的 API 及相关知识总结
  • 如何查看Python内置函数列表
  • 面试之MySQL慢查询优化干货分享
  • AT2659S低噪声放大器芯片:1.4-3.6V宽电压供电,集成50Ω匹配
  • springboot+vue实现服装商城系统(带用户协同过滤个性化推荐算法)
  • 使用SFunction获取属性名,减少嵌入硬编码
  • 初识Linux 进程:进程创建、终止与进程地址空间
  • js绑定事件
  • RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性
  • 在CuPy中使用多节点多GPU环境
  • C#基础:yield return关键字的特点
  • 2025ICPC武汉邀请赛-F