Java反射机制的核心是在运行时动态获取类信息并操作成员,包括通过三种方式获取Class对象、读写私有字段、调用任意方法、实例化对象,所有私有成员操作均需先调用setAccessible(true)。

反射机制的核心,是在运行时通过类或对象的信息,动态访问、修改属性,调用方法,甚至创建实例——不依赖编译期已知类型。
一、获取 Class 对象的三种方式
所有反射操作都始于一个 Class 实例。Java 提供三种可靠途径:
-
对象.getClass():已有实例时最直接,如
new Person().getClass() - 类名.class:编译期已知类型,安全高效,常用于工具类或泛型上下文
-
Class.forName("全限定类名"):字符串驱动,支持动态加载,需捕获
ClassNotFoundException;常见于配置文件或插件系统
二、读写字段(Field):包括私有变量
字段操作分“可见性”与“访问控制”两层逻辑:
-
getFields()只返回 public 字段(含父类继承的) -
getDeclaredFields()返回本类声明的全部字段(private/protected/default/static 均包含) - 要读写 private 字段,必须先调用
field.setAccessible(true),否则抛IllegalAccessException - 常用操作:
field.get(obj)获取值,field.set(obj, value)设置值;field.getType()查类型
三、调用方法(Method):支持任意修饰符
方法反射的关键是 invoke(),但获取阶段需注意匹配规则:
-
getMethods()返回本类及父类中所有 public 方法 -
getDeclaredMethods()返回本类声明的全部方法(含 private、static 等) -
getMethod("name", paramTypes...)查找 public 方法,参数类型必须严格匹配 -
getDeclaredMethod("name", paramTypes...)查找本类任意访问级别的方法 - 调用前若为 private 方法,同样需
method.setAccessible(true) - 调用语法:
method.invoke(obj, args...);静态方法传null作第一个参数
四、实例化对象:绕过构造限制
反射可突破 new 关键字的硬编码限制,尤其适用于框架场景:
-
getConstructors():仅返回 public 构造器 -
getDeclaredConstructors():返回本类所有构造器(含 private) - 获取后调用
constructor.newInstance(args...)创建实例 - 若构造器为 private,必须先执行
constructor.setAccessible(true) - 无参构造可用
clazz.getDeclaredConstructor().newInstance()
不复杂但容易忽略:每次对私有成员的操作前,setAccessible(true) 是必要步骤;它临时关闭 JVM 的访问检查,不是永久修改修饰符。

















