反射的作用
- 基本作用:可以得到一个类的全部成分然后操作。
- 可以破坏封装性
- 最重要的用途是:适合做Java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能。
案例:使用反射做一个简易版的框架
需求:
- 对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去。
实现步骤:
- 定义一个方法,可以接收任意对象。
- 每收到一个对象后,使用反射获取该对象的Class对象,然后获取全部的成员变量。
- 遍历成员变量,然后提取成员变量在该对象中的具体值。
- 把成员变量名、和其值,写出到文件中去即可。
代码演示如下:
学生类:
public class Student { private String name; private int age; private char sex; private double height; private String hobby; public Student() { } public Student(String name, int age, char sex, double height, String hobby) { this.name = name; this.age = age; this.sex = sex; this.height = height; this.hobby = hobby; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } }
教师类:
public class Teacher { private String name; private double salary; public Teacher() { } public Teacher(String name, double salary) { this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
框架:
public class ObjectFrame { //目标:保存任意对象的字段和其他数据到文件中去 public static void saveObject(Object obj) throws Exception{ PrintStream ps = new PrintStream(new FileOutputStream("/Users/birdbird/Documents/Java code/Java ProMax/hightstudy/junit-reflect-annotation-proxy-app/src/com/birdbird/d2_reflect/data.txt",true)); //obj是任意对象,到底有多少个字段要保存 Class c = obj.getClass(); String cName = c.getSimpleName(); ps.println("----------" + cName + "----------"); //2.从这个类中提取它的全部成员变量 Field[] fields = c.getDeclaredFields(); //3.遍历每个成员变量 for (Field field : fields) { //4.拿到成员变量的名字 String name = field.getName(); //5.拿到这个成员变量在对象中的数据 field.setAccessible(true);//禁止检查访问控制 String value = field.get(obj) + ""; ps.println(name + "=" + value); } ps.close(); } }
测试类:
public class Test5Frame { @Test public void save() throws Exception{ Student s1 = new Student("蔡虚坤",66,'鸡',170,"唱,跳,rap,篮球"); Teacher t1 = new Teacher("蔡只因",999.9); //需求:把任意对象的字段名和其对应的值等信息,保存到文件中去。 ObjectFrame.saveObject(s1); ObjectFrame.saveObject(t1); } }