551 words
3 minutes
Java SE 系列(八):反射机制核心

AI 智能总结

Java SE 8 反射机制核心#

反射是 Java 框架底层核心原理,允许程序在运行时获取类信息、动态创建对象、调用方法、操作属性,突破编译期固定代码限制,Spring、MyBatis 底层均大量依赖反射。

一、Class 核心对象#

Class 是所有类的字节码对象,反射的入口,一个类在运行中只会存在一个 Class 实例。 三种获取 Class 对象的常用方式:

// 1. 类名.class
Class<User> clazz1 = User.class;
// 2. 对象.getClass()
User user = new User();
Class<? extends User> clazz2 = user.getClass();
// 3. 全类名反射获取(最常用)
Class<?> clazz3 = Class.forName("com.demo.User");

二、反射获取类结构信息#

通过 Class 对象,可动态提取构造器、成员方法、成员变量,无视权限修饰符。

1. 获取构造器并创建对象#

可获取私有构造器,突破 new 关键字限制实现动态实例化。

Class<User> clazz = User.class;
// 获取无参构造
User user = clazz.newInstance();
// 获取有参构造并创建对象
Constructor<User> constructor = clazz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true); // 暴力破解私有构造
User u = constructor.newInstance("张三", 20);

2. 获取并调用成员方法#

支持调用私有、公有任意方法,实现动态方法执行。

// 获取指定参数方法
Method method = clazz.getDeclaredMethod("say", String.class);
method.setAccessible(true);
// 执行方法:对象、方法参数
method.invoke(u, "反射调用方法");

3. 获取并操作成员属性#

动态读取、修改对象属性值,无视 private 权限。

Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
// 修改属性
field.set(u, "李四");
// 获取属性值
System.out.println(field.get(u));

三、反射动态操作核心特点#

动态性:运行时动态加载类、创建对象、执行逻辑,适配框架通用化设计。
权限突破:setAccessible(true) 可访问私有资源。
通用性强:无需提前 new 对象,通过全类名即可操作任意类。

核心总结#

Class 对象是反射唯一入口,贯穿所有反射操作。
反射核心能力:获取构造、获取方法、获取属性、动态调用。
setAccessible(true) 暴力破解权限,是反射操作私有资源的关键。
反射牺牲少量性能,换取代码通用性与灵活性,是框架底层基石。

Java SE 系列(八):反射机制核心
https://fuwari.vercel.app/posts/java-se-series/java-se-08-reflection/
Author
Zero02
Published at
2025-02-23
License
CC BY-NC-SA 4.0