【Java 反射的使用】
系列文章目录
Java知识点
文章目录
- 系列文章目录
- 👉前言
- 👉一、使用方法
- 👉1-1、获取类的 Class 对象
- 👉1-2、操作构造方法
- 👉1-3、操作字段(Field)
- 👉1-4、操作方法(Method)
- 👉二、注意事项
- 👉壁纸分享
- 👉总结
👉前言
反射(Reflection)是 Java 提供的一种动态操作类、对象、方法和属性的机制。通过反射,可以在运行时获取类的元数据(如类名、方法、字段等),并动态调用对象的方法或修改字段的值,而无需在编译时确定具体类型。
反射的原理
-
Class 对象与元数据
JVM 在加载类时,会为每个类生成一个唯一的 Class 对象,存储类的元数据(如方法、字段、构造方法等)。
反射 API(如 getMethod, getField)通过访问 Class 对象中的元数据实现动态操作。 -
动态调用机制
方法调用通过 Method.invoke() 实现,本质是 JVM 内部通过方法指针(类似 C++ 的虚函数表)定位方法地址。
字段访问通过 Unsafe 类或直接内存操作实现。 -
性能损耗来源
反射调用需要动态解析类信息、权限检查、方法调用优化(如 JIT 编译前的解释执行)。
博客将会介绍如何实现Java 反射的使用方法。希望这篇博客对Unity的开发者有所帮助。
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.下面就让我们进入正文吧 !
提示:以下是本篇文章正文内容,下面案例可供参考
👉一、使用方法
👉1-1、获取类的 Class 对象
反射的核心是 Class 对象,所有反射操作都基于此。获取 Class 对象的方式有三种:
- 类名.class:
Class<?> clazz = String.class;
- 对象.getClass():
String str = "Hello";
Class<?> clazz = str.getClass();
- Class.forName()(最常用):
Class<?> clazz = Class.forName("java.lang.String");
👉1-2、操作构造方法
- 获取构造方法:
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); // 指定参数类型
- 创建实例:
Object instance = constructor.newInstance("Hello");
👉1-3、操作字段(Field)
- 获取字段:
Field field = clazz.getDeclaredField("fieldName"); // 获取字段(包括私有)
- 访问或修改字段值:
field.setAccessible(true); // 解除私有字段的访问限制
field.set(instance, "newValue"); // 修改值
Object value = field.get(instance); // 获取值
👉1-4、操作方法(Method)
- 获取方法:
Method method = clazz.getDeclaredMethod("methodName", int.class); // 方法名 + 参数类型
- 调用方法:
method.setAccessible(true); // 若方法是私有的
Object result = method.invoke(instance, 123); // 调用并传参
👉二、注意事项
-
性能问题
反射操作比直接调用慢,频繁调用时需谨慎。
优化方案:缓存 Class、Method、Field 等对象,避免重复解析。 -
安全限制
反射可以突破访问权限(如调用私有方法),但可能破坏封装性。
安全策略:通过 SecurityManager 限制反射权限。 -
兼容性问题
反射依赖类名、方法名等字符串,若类结构变更(如方法重命名),反射代码会直接报错(如 NoSuchMethodException)。 -
模块化系统(Java 9+)
在模块化项目中,默认禁止反射访问其他模块的非导出类。
解决方案:在 module-info.java 中添加 opens 语句开放包访问权限。 -
单例模式破坏
反射可以绕过私有构造方法创建实例,破坏单例模式。
防御方案:在构造方法中增加防御逻辑,如:
private Singleton() {if (instance != null) {throw new IllegalStateException("单例已存在!");}
}
反射是 Java 动态能力的核心,但需谨慎使用。在明确需求且无替代方案时,合理利用反射可以大幅提升灵活性;滥用则会导致性能下降、代码可维护性降低。
典型应用场景
-
框架开发(如 Spring 的依赖注入、MyBatis 的 ORM 映射)。
-
动态代理(如 Proxy.newProxyInstance())。
-
注解处理器(如 Lombok 通过反射生成代码)。
👉壁纸分享
👉总结
本次总结的就是Java 反射的使用方法, 有需要会继续增加功能
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!