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

晓知识: 如何理解反射

Java 反射的概念

Java 反射(Reflection)是一种在运行时动态获取类信息、操作类属性和方法的机制。通过反射,可以在程序运行时检查类、接口、字段和方法,而不需要在编译时知道这些类的具体定义。反射的核心是 java.lang.reflect 包,提供了 ClassMethodFieldConstructor 等类来实现动态操作。

反射的核心类

  • Class:表示类或接口,是反射的入口。可以通过 Class 对象获取类的构造方法、字段、方法等信息。
  • Field:表示类的成员变量,可以动态获取或修改字段的值(包括私有字段)。
  • Method:表示类的方法,可以动态调用方法(包括私有方法)。
  • Constructor:表示类的构造方法,可以动态创建对象实例。

反射的基本用法

获取 Class 对象

// 方式1:通过类名.class
Class<?> clazz = String.class;// 方式2:通过对象.getClass()
String str = "Hello";
Class<?> clazz = str.getClass();// 方式3:通过 Class.forName("全限定类名")
Class<?> clazz = Class.forName("java.lang.String");

创建对象实例

Class<?> clazz = Class.forName("java.lang.String");
// 调用无参构造方法
String str = (String) clazz.newInstance(); // 已过时,推荐使用 getConstructor()
// 使用 Constructor
Constructor<?> constructor = clazz.getConstructor();
String str = (String) constructor.newInstance();
访问字段
Class<?> clazz = Person.class;
Field field = clazz.getDeclaredField("name"); // 获取字段(包括私有字段)
field.setAccessible(true); // 允许访问私有字段
Person person = new Person();
field.set(person, "Alice"); // 设置字段值
String name = (String) field.get(person); // 获取字段值

调用方法

Class<?> clazz = Person.class;
Method method = clazz.getDeclaredMethod("sayHello", String.class); // 获取方法
method.setAccessible(true); // 允许调用私有方法
Person person = new Person();
Object result = method.invoke(person, "World"); // 调用方法
System.out.println(result); // 输出方法返回值

反射的应用场景

  1. 动态加载类:在运行时加载并操作未知的类(如插件化开发)。
  2. 框架开发:Spring、Hibernate 等框架利用反射实现依赖注入、ORM 映射等功能。
  3. 测试工具:JUnit 等测试框架通过反射调用测试方法。
  4. 反编译工具:分析类的结构,获取类的方法、字段等信息。

反射的优缺点

  • 优点:灵活性高,可以实现动态编程,适合框架和工具开发。
  • 缺点:性能较低(比直接调用慢),破坏封装性(可以访问私有成员),可能引发安全问题。

注意事项

  1. 反射操作私有成员时需调用 setAccessible(true),但可能违反封装原则。
  2. 反射会降低性能,应避免在频繁调用的代码中使用。
  3. 反射可能引发 ClassNotFoundExceptionNoSuchMethodException 等异常,需妥善处理。

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

相关文章:

  • Seed-VC:零样本语音转换与扩散transformer
  • 启保停-----------单相照明灯的接法
  • 【数据库】 MySQL 表的操作详解
  • 编程模型设计空间的决策思路
  • 贪心----4.划分字母区间
  • 【科研绘图系列】R语言绘制特定区域颜色标记散点图
  • Seata深度剖析:微服务分布式事务解决方案
  • 自然语言处理( NLP)基础
  • docker-compose搭建 redis 集群
  • Gartner 《IAM for LLM-Based AI Agents》学习心得
  • archlinux中VLC无法播放视频的解决办法
  • 【AI生成+补充】高频 hql的面试问题 以及 具体sql
  • ARM芯片架构之CoreSight SoC-400 组件介绍
  • dag实现案例 02、实现简易版dag调度系统(基于01之上升级)
  • C语言—数组和指针练习题合集(二)
  • python调研本地 DeepSeek API的例子
  • IIS Express中可以同时加载并使用.net4.0和.NET 2.0的 DLL
  • 还在用PUT更新局部数据?Jakarta REST 4.0 的“合并补丁”,优雅!
  • 【element树组件】el-tree实现连接线及hover编辑效果
  • Java进阶学习之不可变集合
  • Ubuntu与Rocky系统安装Java全指南
  • 《软件工程导论》实验报告一 软件工程文档
  • 基于LLVM的memcpy静态分析工具:设计思路与原理解析(C/C++代码实现)
  • Life:Internship in OnSea Day 50, 51
  • 11. React组件插槽用法
  • Flink Python API 提交 Socket 数据源的 WordCount 作业
  • uni-app实战教程 从0到1开发 画图软件 (学会画图)
  • Flutter UI Kits by Olayemi Garuba:免费开源的高质量UI组件库
  • nvm install 14.21.3 时npm 无法下载和识别
  • -bash: ./restart.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录