|
@@ -46,27 +46,12 @@ import java.lang.reflect.Constructor;
|
|
|
|
|
|
|
|
public class ReflectCreateSysUserTest {
|
|
public class ReflectCreateSysUserTest {
|
|
|
public static void main(String[] args) throws Exception {
|
|
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 class ReflectSetFieldTest {
|
|
|
public static void main(String[] args) throws Exception {
|
|
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 class ReflectInvokeMethodTest {
|
|
|
public static void main(String[] args) throws Exception {
|
|
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 class ReflectFrameWorkTest {
|
|
|
public static void main(String[] args) throws Exception {
|
|
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. 打印对象验证
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|