|
|
@@ -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 字符串传类名最灵活,是框架最常用的方式)
|
|
|
|
|
|
---
|
|
|
|