Răsfoiți Sursa

fix: 进一步精简20260812反射练习代码框架——移除全部TODO填空提示注释,仅保留1~7条普通注释的大致步骤引导(如练习一:获取Class对象→统计构造个数→四个构造逐一反射创建对象),让学生自行回忆并写出具体反射API调用

WanJL 1 săptămână în urmă
părinte
comite
ecec9fadc2
1 a modificat fișierele cu 25 adăugiri și 79 ștergeri
  1. 25 79
      课堂练习题/20260812-反射练习.md

+ 25 - 79
课堂练习题/20260812-反射练习.md

@@ -46,27 +46,12 @@ import java.lang.reflect.Constructor;
 
 public class ReflectCreateSysUserTest {
     public static void main(String[] args) throws Exception {
-        // ① 方式三:Class.forName("全类名") 获取 SysUser 的 Class 对象
-        // TODO 1: Class<?> clazz = Class.forName("???");   // ??? 填 SysUser 的全类名
-
-        // ② 统计构造方法:getConstructors() 只能拿到 public,getDeclaredConstructors() 能拿到全部(含 private)
-        // TODO 2: 打印两个方法返回数组的 length(应分别得到 2 和 4)
-
-        // ③ 反射创建对象①:public 无参构造
-        // TODO 3: 用 getConstructor() 获取无参构造 + newInstance() 创建对象,
-        //         打印对象并用 instanceof SysUser 判断,格式参考"输出示例①"
-
-        // ④ 反射创建对象②:public 六参构造(id, username, password, name, phone, email)
-        // TODO 4: 用 getConstructor(6 个 String.class) 获取构造
-        //         + newInstance("1","zhangsan","123456","张三","13800000000","zhangsan@qq.com") 创建并打印
-
-        // ⑤ 反射创建对象③:private 二参构造(username, password)—— 必须暴力反射!
-        // TODO 5: 用 getDeclaredConstructor(String.class, String.class) 获取 private 构造
-        //         + setAccessible(true) 放开权限 + newInstance("admin","admin888") 创建并打印
-
-        // ⑥ 反射创建对象④:private 四参构造(id, name, phone, email)
-        // TODO 6: 用 getDeclaredConstructor(4 个 String.class) 获取 private 构造
-        //         + setAccessible(true) + newInstance("2","李四","13900000000","lisi@qq.com") 创建并打印
+        // 1. 用 Class.forName 获取 SysUser 的 Class 对象
+        // 2. 分别打印 public 构造个数和全部构造个数
+        // 3. 用 public 无参构造反射创建对象①,并 instanceof 判断
+        // 4. 用 public 六参构造反射创建对象②
+        // 5. 用 private 二参构造反射创建对象③(需放开访问权限)
+        // 6. 用 private 四参构造反射创建对象④(需放开访问权限)
     }
 }
 ```
@@ -123,27 +108,13 @@ import java.lang.reflect.Field;
 
 public class ReflectSetFieldTest {
     public static void main(String[] args) throws Exception {
-        // ① 获取 Class 对象 + 反射创建对象(复用练习一的四步链)
-        // TODO 1: 用 Class.forName("course.Student") 拿 Class,getConstructor().newInstance() 创建对象
-
-        // ② 获取私有属性 name 的 Field 对象
-        // TODO 2: Field fieldName = clazz.getDeclaredField("???");   // ??? 填属性名
-
-        // ③ 放开私有访问权限(暴力反射的关键一步!)
-        // TODO 3: 调用 fieldName.setAccessible(true)
-
-        // ④ 给私有属性 name 赋值
-        // TODO 4: 调用 fieldName.set(obj, "张三")
-
-        // ⑤ 依次给 id(1001)、age(20)、gender("男") 赋值
-        // TODO 5: 参照上面 name 的写法(getDeclaredField + setAccessible + set),
-        //         分别获取 id/age/gender 三个字段并赋值
-
-        // ⑥ 用 field.get(obj) 读取属性值打印验证
-        // TODO 6: 用 fieldId.get(obj)、fieldName.get(obj) 等读取 4 个属性值并打印,格式参考"输出示例"
-
-        // ⑦ 调用方法观察输出
-        // TODO 7: 强转 ((Student) obj).study();
+        // 1. 反射创建 Student 对象(复用练习一的流程)
+        // 2. 获取私有属性 name 的字段对象
+        // 3. 放开私有访问权限
+        // 4. 给 name 赋值
+        // 5. 依次给 id、age、gender 赋值
+        // 6. 读取 4 个属性值打印验证
+        // 7. 强转成 Student 调用 study() 方法
     }
 }
 ```
@@ -198,24 +169,12 @@ import java.lang.reflect.Method;
 
 public class ReflectInvokeMethodTest {
     public static void main(String[] args) throws Exception {
-        // ① 反射创建对象 + 反射给 name 赋值(复用练习一、二)
-        // TODO 1: 用 Class.forName("course.Student") 拿 Class,getConstructor().newInstance() 创建对象
-        // TODO 2: 用反射给私有属性 name 赋值为 "张三"(getDeclaredField + setAccessible(true) + set)
-
-        // ② 获取 study 方法对象(无参数)
-        // TODO 3: Method studyMethod = clazz.getMethod("???");   // ??? 填方法名
-
-        // ③ 反射调用无参方法
-        // TODO 4: 用 studyMethod.invoke(obj) 调用方法
-
-        // ④ 获取带 String 参数的 sayHello 方法
-        // TODO 5: Method sayHelloMethod = clazz.getMethod("sayHello", ???);   // ??? 填参数类型
-
-        // ⑤ 反射调用带参方法,接收返回值
-        // TODO 6: Object result = sayHelloMethod.invoke(obj, "李四");
-
-        // ⑥ 打印返回值
-        // TODO 7: System.out.println("sayHello 返回:" + result);
+        // 1. 反射创建 Student 对象,并给 name 属性赋值
+        // 2. 获取无参方法 study 的方法对象
+        // 3. 反射调用 study 方法
+        // 4. 获取带 String 参数的 sayHello 方法对象
+        // 5. 反射调用 sayHello 方法,传入参数并接收返回值
+        // 6. 打印返回值
     }
 }
 ```
@@ -280,25 +239,12 @@ import java.util.Properties;
 
 public class ReflectFrameWorkTest {
     public static void main(String[] args) throws Exception {
-        // ① 加载配置文件(回顾 Demo03:类加载器加载资源文件)
-        // TODO 1: 用 ClassLoader.getSystemClassLoader().getResourceAsStream("student.properties") 获取输入流
-        // TODO 2: 创建 Properties 对象,load(输入流) 解析,然后关闭流
-
-        // ② 从配置读取:类名 / 属性值 / 方法名(全部从配置文件读取,不要写死!)
-        // TODO 3: 用 pro.getProperty("student.className") / ("student.name") / ("student.methodName")
-        //         分别读取 className、name、methodName 三个值
-
-        // ③ 反射:根据配置的类名加载类 + 创建对象(框架的核心动作!)
-        // TODO 4: 用 Class.forName(className) 反射加载类,getConstructor().newInstance() 创建对象
-
-        // ④ 反射:给属性赋值(属性名、属性值都来自配置文件)
-        // TODO 5: 用 getDeclaredField("name") + setAccessible(true) + set(obj, name) 给私有属性赋值
-
-        // ⑤ 反射:调用方法(方法名来自配置文件)
-        // TODO 6: 用 getMethod(methodName) 获取方法,invoke(obj) 调用
-
-        // ⑥ 打印创建的对象,验证属性已赋值
-        // TODO 7: System.out.println(obj);
+        // 1. 加载配置文件 student.properties(类加载器 + Properties)
+        // 2. 从配置读取类名、属性值、方法名
+        // 3. 根据配置的类名反射加载类并创建对象
+        // 4. 反射给属性赋值
+        // 5. 反射调用方法
+        // 6. 打印对象验证
     }
 }
 ```