Java反射机制概述
反射机制让Java在运行时具备动态获取类信息和调用方法的能力。
什么是反射
反射(Reflection)是指在程序运行时,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性。
核心类
| 类名 | 作用 |
|---|---|
| Class | 类的元数据描述 |
| Field | 类的成员变量 |
| Method | 类的方法 |
| Constructor | 类的构造器 |
| Annotation | 注解信息 |
获取Class对象的三种方式
Java
// 方式1:类名.class
Class<?> clazz1 = String.class;
// 方式2:对象.getClass()
String str = "hello";
Class<?> clazz2 = str.getClass();
// 方式3:Class.forName()(最常用)
Class<?> clazz3 = Class.forName("java.lang.String");
反射的核心能力
Java
// 获取类名
String className = clazz.getName(); // 全限定名
String simpleName = clazz.getSimpleName(); // 简单类名
// 获取修饰符
int modifiers = clazz.getModifiers();
boolean isPublic = Modifier.isPublic(modifiers);
// 获取父类和接口
Class<?> superClass = clazz.getSuperclass();
Class<?>[] interfaces = clazz.getInterfaces();
典型应用场景
- 框架设计:Spring的IoC容器、MyBatis的Mapper代理
- 序列化/反序列化:JSON库解析对象
- 动态代理:AOP实现
- 测试框架:JUnit注解扫描
注意事项
反射会牺牲一定的性能,频繁调用应缓存Class对象
反射可以突破访问修饰符限制,使用setAccessible(true)访问私有成员
反射操作不当会破坏封装性,应谨慎使用
要点总结
- 反射在运行时获取类信息,是Java动态性的基础
- 三种获取Class方式:
.class、getClass()、Class.forName() - 核心API:Class、Field、Method、Constructor
- 广泛应用于框架、序列化、动态代理等场景
📝 发现内容有误?点击此处直接编辑