【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开发技巧,觉得有用记得一键三连哦。么么哒!

你可能感兴趣的:(Java知识点,java,开发语言,大数据,ui,c++,c#)