https://www.bilibili.com/video/BV1ke4y1w7yn
什么是反射 ?
反射允许对字段(成员变量),成员方法和构造方法的信息进程编程访问。
获取类对象字节码文件的三种方式
Class.forName(“全类名”);
类名.class;
对象.getClass();
1 | package com.qust; |
点击类名,点击 copy - cpoy as Reference,即可复制全类名(包名 + 类名)
利用反射获取成员变量信息
Class 中用于获取成员变量的方法
Field[] getFields()
: 返回所有公共成员变量对象的数组Field[] getDeclaredFields()
: 返回所有成员变量对象的数组Field getField()
: 返回单个公共成员变量对象Field getDeclaredField()
: 返回单个成员变量对象
Field 类中用于创建对象的方法
void set(Object obj, Object value) : 赋值
Object get(Object obj) :获取值
1 | package com.qust; |
利用反射获取成员方法
Class 类中获取成员方法的方法
Method[] getMethods() : 返回所有公共成员方法的数组,包括继承的
Method[] getDeclaredMethods()
Methods[] getMethod(String name, Class<?> … Parameters)
Methods[] getDeclaredMethod(String name, Class<?> … Parameters)
Method 类中用于创建对象的方法
- Object invoke(Object object, Object .. args) : 运行方法
参数一 :用 obj 对象调用该方法
参数二 :调用方法的传递的参数(没有就不写)
返回值 :方法的返回值(没有就不写)
1 | package com.qust; |
反射的作用
获取一个类的所有的信息,获取到了之后,在执行其他的业务逻辑
结合配置文件,动态的创建并调用方法
练习一 保存信息
对于任意一个对象,都可以把对象的所有字段名和值,保存到文件中
1 | package com.qust.practice1; |
不知道为什么相对路径写入信息写不进去,也没提示找不到文件报错
练习二
跟配置文件结合,动态创建对象,并调用方法
- Main.java
1 | package com.qust.practice2; |
- test.properties
1 | classname=com.qust.practice2.Student |
如果之后要运行别的类的方法,修改配置文件即可,例如修改为
className
classname=com.qust.practice2.Teacher
method=teach