一、反射(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();}
}