一、反射(Reflection)
-
反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
-
动态语言,是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。
-
通俗点说就是在运行时代码可以根据某些条件改变自身结构。
二、反射学什么
-
学习获取类的信息,进行操作
-
反射第一步:加载类(字节码文件到内存中),获取类的字节码---Class对象
-
获取类的构造器:Constructor 对象
-
获取类的成员变量:Field对象
-
获取类的成员方法:Method对象
-
三、获取Class对象的三种方式
-
Class c1 = 类名.class
-
调用提供的方法:public static forName(String package)
-
Object提供的方法:public Class getClass();
-
Class c3 = 对象.getClass();
-
四、获取类的构造器
4.1获取类的和构造器的作用:初始化对象然后返回
五、获取类的成员变量
5.1获取到成员变量的作用:赋值、取值
六、获取类的成员方法
6.1获取成员方法的作用:执行
七、反射作用,应用场景
八、案例
package com.itheima.myreflect7;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
/**
* @author zhumq
* @date 2024/7/1 23:43
*/
public class ObjectFrame {
// 目标:能够保存任意对象的字段和字段数据到文件中
public static void saveObject(Object obj) throws Exception {
PrintStream ps = new PrintStream(new FileOutputStream("myreflec\\src\\data.txt", true));
// obj 任意对象,到底有多少字段要保存
Class c = obj.getClass();
String cName = c.getSimpleName();
ps.println("-------------------"+cName+"-------------------");
// 从class对象中获取所有的字段
Field[] fields = c.getDeclaredFields();
// 便利每个字段
for (Field field : fields) {
// 获取字段名称
String name = field.getName();
// 禁止检查访问权限
field.setAccessible(true);
// 获取字段值
Object value = field.get(obj);
// 保存到文件中
ps.println(name + "=" + value);
}
ps.close();
}
}