Просмотр исходного кода

feat: 放宽反射遍历SysUser题目的Class对象获取方式——同步修改课堂练习练习一与课后作业题目1,获取Class对象不再限定Class.forName,改为三种方式任选其一(类名.class编译期最安全/对象.getClass()需先有对象/Class.forName最灵活框架最常用,三者殊途同归拿到同一个对象),同步更新知识点/场景提示/实现步骤/代码框架注释,思考题新增三种方式对比

WanJL 1 неделя назад
Родитель
Сommit
2e3234a8fc
2 измененных файлов с 18 добавлено и 6 удалено
  1. 9 3
      课后作业/2026年8月12日-作业.md
  2. 9 3
      课堂练习题/20260812-反射练习.md

+ 9 - 3
课后作业/2026年8月12日-作业.md

@@ -29,7 +29,7 @@
 
 ### 题目 1:反射遍历 SysUser 四个构造方法创建对象(⭐⭐⭐ 必做)
 
-**知识点**:`Class.forName("全类名")` 获取 Class 对象、`getConstructors()` / `getDeclaredConstructors()` 获取构造方法数组、`getConstructor(参数类型...)` / `getDeclaredConstructor(参数类型...)` 获取指定构造方法、`newInstance()` 反射创建对象、`setAccessible(true)` 暴力反射访问私有构造、`instanceof` 判断类型、向下转型、调用 toString()
+**知识点**:获取 Class 对象三种方式(`类名.class` / `对象.getClass()` / `Class.forName("全类名")`,同一个类三种方式拿到同一个对象)、`getConstructors()` / `getDeclaredConstructors()` 获取构造方法数组、`getConstructor(参数类型...)` / `getDeclaredConstructor(参数类型...)` 获取指定构造方法、`newInstance()` 反射创建对象、`setAccessible(true)` 暴力反射访问私有构造、`instanceof` 判断类型、向下转型、调用 toString()
 
 **场景描述**:课堂学了**反射最核心的用途**——拿到 Class 对象后,通过构造方法创建对象(这是 Spring IOC 等框架的底层原理)。`SysUser` 系统用户类一共有 **4 个构造方法**(2 个 public + 2 个 private):
 
@@ -45,6 +45,11 @@ private SysUser(String id, String name,
 
 请用反射**分别通过这 4 个构造方法创建 4 个 SysUser 对象**——完整走一遍"拿 Class → 拿构造 → 建对象"的反射创建对象流程,并重点体会:**private 构造方法必须用 `getDeclaredConstructor` + `setAccessible(true)` 暴力反射**才能调用。
 
+> **💡 获取 Class 对象的方式**:第一步"拿 Class"有三种方式任选其一,结果殊途同归(同一个类三种方式拿到的是同一个对象)——
+> ① `SysUser.class`(类名.class,编译期类型检查最安全)
+> ② `new SysUser().getClass()`(对象.getClass(),需先有对象实例)
+> ③ `Class.forName("course.SysUser")`(全类名字符串,最灵活、框架最常用)
+
 **题目要求**:
 
 ```java
@@ -57,7 +62,7 @@ private SysUser(String id, String name,
 
 **实现步骤**:
 
-1. `Class.forName("course.SysUser")` 获取 SysUser 的 Class 对象
+1. 获取 SysUser 的 Class 对象(三种方式任选其一:`SysUser.class` / `new SysUser().getClass()` / `Class.forName("course.SysUser")`)
 2. `getConstructors()` 统计 public 构造个数(2 个),`getDeclaredConstructors()` 统计全部构造个数(4 个,含 private)
 3. **反射创建对象①**:`getConstructor()` 获取 public 无参构造 → `newInstance()` 创建空对象
 4. **反射创建对象②**:`getConstructor(String.class × 6)` 获取 public 六参构造 → `newInstance(id, username, password, name, phone, email)` 创建完整用户对象
@@ -74,7 +79,7 @@ import java.lang.reflect.Constructor;
 
 public class Demo_01_你的姓名 {
     public static void main(String[] args) throws Exception {
-        // 1. 用 Class.forName 获取 SysUser 的 Class 对象
+        // 1. 获取 SysUser 的 Class 对象(类.class / 对象.getClass() / Class.forName 三选一)
         // 2. 分别打印 public 构造个数和全部构造个数
         // 3. 用 public 无参构造反射创建对象①,并 instanceof 判断
         // 4. 用 public 六参构造反射创建对象②
@@ -107,6 +112,7 @@ public 构造方法个数:2
 1. SysUser 有 2 个 private 构造方法,为什么 `getConstructor()` 拿不到它们?必须用什么方法组合?(提示:`getDeclaredConstructor` + `setAccessible(true)`,口诀"含 Declared 的才能拿私有")
 2. public 构造和 private 构造,反射创建对象的方式有什么不同?多出来的 `setAccessible(true)` 做了什么?
 3. 反射创建的对象是 `Object` 类型,怎么确认它确实是 SysUser?确认后如何调用 SysUser 的方法?(提示:`instanceof` + 强转)
+4. 获取 Class 对象的三种方式(`类名.class` / `对象.getClass()` / `Class.forName`)有什么区别?哪种最灵活、框架最常用?(提示:类名.class 编译期类型检查最安全 / getClass() 需先有对象实例 / Class.forName 字符串传类名最灵活,是框架最常用的方式)
 
 ---
 

+ 9 - 3
课堂练习题/20260812-反射练习.md

@@ -7,7 +7,7 @@
 ## 练习一:反射创建对象 —— 遍历 SysUser 的四个构造方法建对象
 
 **难度**:⭐⭐⭐
-**知识点**:`Class.forName("全类名")` 获取 Class 对象、`getConstructors()` / `getDeclaredConstructors()` 获取构造方法数组、`getConstructor(参数类型...)` / `getDeclaredConstructor(参数类型...)` 获取指定构造方法、`newInstance()` 反射创建对象、`setAccessible(true)` 暴力反射访问私有构造、`instanceof` 判断类型、向下转型、调用 toString()
+**知识点**:获取 Class 对象三种方式(`类名.class` / `对象.getClass()` / `Class.forName("全类名")`,同一个类三种方式拿到同一个对象)、`getConstructors()` / `getDeclaredConstructors()` 获取构造方法数组、`getConstructor(参数类型...)` / `getDeclaredConstructor(参数类型...)` 获取指定构造方法、`newInstance()` 反射创建对象、`setAccessible(true)` 暴力反射访问私有构造、`instanceof` 判断类型、向下转型、调用 toString()
 
 **场景描述**:课堂学了**反射最核心的用途**——拿到 Class 对象后,通过构造方法创建对象(这是 Spring IOC 等框架的底层原理)。`SysUser` 系统用户类一共有 **4 个构造方法**(2 个 public + 2 个 private):
 
@@ -23,13 +23,18 @@ private SysUser(String id, String name,
 
 本例用反射**分别通过这 4 个构造方法创建 4 个 SysUser 对象**——完整走一遍"拿 Class → 拿构造 → 建对象"的反射创建对象流程,并重点体会:**private 构造方法必须用 `getDeclaredConstructor` + `setAccessible(true)` 暴力反射**才能调用。
 
+> **💡 获取 Class 对象的方式**:第一步"拿 Class"有三种方式任选其一,结果殊途同归(同一个类三种方式拿到的是同一个对象)——
+> ① `SysUser.class`(类名.class,编译期类型检查最安全)
+> ② `new SysUser().getClass()`(对象.getClass(),需先有对象实例)
+> ③ `Class.forName("course.SysUser")`(全类名字符串,最灵活、框架最常用)
+
 ### 案例需求
 
 用反射分别通过 SysUser 的 4 个构造方法创建 4 个对象,并打印每个对象验证(`toString()`)。
 
 ### 实现步骤
 
-1. `Class.forName("course.SysUser")` 获取 SysUser 的 Class 对象
+1. 获取 SysUser 的 Class 对象(三种方式任选其一:`SysUser.class` / `new SysUser().getClass()` / `Class.forName("course.SysUser")`)
 2. `getConstructors()` 统计 public 构造个数(2 个),`getDeclaredConstructors()` 统计全部构造个数(4 个,含 private)
 3. **反射创建对象①**:`getConstructor()` 获取 public 无参构造 → `newInstance()` 创建空对象
 4. **反射创建对象②**:`getConstructor(String.class × 6)` 获取 public 六参构造 → `newInstance(id, username, password, name, phone, email)` 创建完整用户对象
@@ -46,7 +51,7 @@ import java.lang.reflect.Constructor;
 
 public class ReflectCreateSysUserTest {
     public static void main(String[] args) throws Exception {
-        // 1. 用 Class.forName 获取 SysUser 的 Class 对象
+        // 1. 获取 SysUser 的 Class 对象(类.class / 对象.getClass() / Class.forName 三选一)
         // 2. 分别打印 public 构造个数和全部构造个数
         // 3. 用 public 无参构造反射创建对象①,并 instanceof 判断
         // 4. 用 public 六参构造反射创建对象②
@@ -76,6 +81,7 @@ public 构造方法个数:2
 1. SysUser 有 2 个 private 构造方法,为什么 `getConstructor()` 拿不到它们?必须用什么方法组合?(提示:`getDeclaredConstructor` + `setAccessible(true)`,口诀"含 Declared 的才能拿私有")
 2. public 构造和 private 构造,反射创建对象的方式有什么不同?多出来的 `setAccessible(true)` 做了什么?
 3. 反射创建的对象是 `Object` 类型,怎么确认它确实是 SysUser?确认后如何调用 SysUser 的方法?(提示:`instanceof` + 强转)
+4. 获取 Class 对象的三种方式(`类名.class` / `对象.getClass()` / `Class.forName`)有什么区别?哪种最灵活、框架最常用?(提示:类名.class 编译期类型检查最安全 / getClass() 需先有对象实例 / Class.forName 字符串传类名最灵活,是框架最常用的方式)
 
 ---