一.反射的作用
二.案例
Student.class
package com.njau.d2_reflect;
public class Student {
private String name;
private int age;
private char sex;
private double height;
private String hobby;
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 Student() {
}
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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", height=" + height +
", hobby='" + hobby + '\'' +
'}';
}
}
Teacher.class
package com.njau.d2_reflect;
public class Teacher {
private String name;
private double salary;
public Teacher(String name, double salary) {
this.name = name;
this.salary = salary;
}
public Teacher() {
}
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;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", salary=" + salary +
'}';
}
}
我们定义一个框架用来获取Teacher类和Student类中的全部字段以及属性值。因此我们需要使用反射首先获取到每个类对象,然后再调用其getDeclaredFileds方法来获取所有的成员变量并封装在一个Filed类型的数组中。然后遍历该数组并获得其名称和值,并将其打印到文件中。
框架如下:
package com.njau.d2_reflect;
import org.junit.Test;
import javax.print.attribute.standard.MediaSize;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
public class ObjectFrame {
// 目标:保存任意对象的字段和数据到文件中去
public static void reflectFrame(Object obj) throws Exception {
PrintStream ps = new PrintStream(new FileOutputStream
("src\\data.txt", // 这里要么用绝对路径,要么用从src起之后的
true),true); // append:追加写,是在基础流里面设置为true实现追加写的,而非在打印流中
Class c = obj.getClass();
ps.println("--------------------------" + c.getSimpleName() + "--------------------------");
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
String value = field.get(obj) + "";
ps.println(name + "--->" + value);
}
ps.close();
}
}
反射第一步首先获取类对象。
调用该框架:
package com.njau.d2_reflect;
import org.junit.Test;
/**
* 反射的作用?
* 基本作用:可以得到一个类的全部成分然后操作
* 可以破坏封装性
* 最重要的用途是:适合做Java框架,基本上,主流的框架都会基于反射设计出一些通用的功能
* 使用反射做一个简易版的框架
* 需求:
* 对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去
* 实现步骤:
* 1、定义一个方法,可以接受任意对象
* 2、每收到一个对象后,使用反射获取该对象的Class对象,然后获取全部的成员变量
* 3、遍历成员变量,然后提取成员变量在该对象中的具体值
* 4、把成员变量名和其值,写出到文件中去即可
*/
public class Test5Frame {
@Test
public void save() throws Exception {
Student s = new Student("黑马",18,'男',189,"篮球,羽毛球");
Teacher t = new Teacher("大黑",9000);
ObjectFrame.reflectFrame(s);
ObjectFrame.reflectFrame(t);
}
}