Java借用反射实现一个简单的框架

56 阅读2分钟

目标:提供一个通用框架,支持保存所有对象的具体信息

首先创建两个实体类,分别是Student类和Teacher类来封装信息

Student.java

package reflect.d6_reflect_framework;

public class Student {
    private String name;
    private char sex;
    private int age;
    private String className;
    private String hobby;

    public Student(){}

    public Student(String name, char sex, int age, String className, String hobby) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.className = className;
        this.hobby = hobby;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

Teacher.java

package reflect.d6_reflect_framework;

public class Teacher {
    private String name;
    private char sex;
    private double salary;

    public Teacher(){}

    public Teacher(String name, char sex, double salary) {
        this.name = name;
        this.sex = sex;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

而后,写一个工具类,来保存任意类型的对象

MybatisUtil.java

package reflect.d6_reflect_framework;

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;

/*
      保存任意类型的对象
      @param obj
    */
public class MybatisUtil {
    public static void save(Object obj) {
        try (PrintStream ps = new PrintStream(new FileOutputStream("路径\\d6_reflect_framework.txt", true));
        ) {
            // 1、提取这个对象的全部成员变量(只有反射可以解决)
            Class c = obj.getClass();
            // c.getSimpleName()获取当前类名  c.getName获取全限名:包名+类名
            ps.println("=======" + c.getSimpleName() + "=======");

            // 2、提取它的全部成员变量
            Field[] fields = c.getDeclaredFields();
            // 3、获取成员变量的信息
            for (Field field : fields) {
                // 拿成员变量名
                String name = field.getName();
                field.setAccessible(true);
                // 提取本成员变量在obj对象中的值(取值)

                String value = field.get(obj) + "";
                //保存遍历到的成员变量的名和值
                ps.println(name + "" + value);
            }
            // ps.close(); 将代码放在try()中会自动释放资源
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

main方法:

ReflectDemo.java

package reflect.d6_reflect_framework;

public class ReflectDemo {
    public static void main(String[] args){
        Student s = new Student();
        s.setName("胡图图");
        s.setClassName("翻斗幼儿园");
        s.setAge(10);
        s.setHobby("玩儿");
        s.setSex('男');
        MybatisUtil.save(s);

        Teacher t = new Teacher();
        t.setName("健康哥哥");
        t.setSex('男');
        t.setSalary(8000);
        MybatisUtil.save(t);
    }
}

运行main方法后,内容会输出到之前创建好的d6_reflect_framework.txt中。如下:

d6_reflect_framework.txt

=======Student=======
name胡图图
sex男
age10
className翻斗幼儿园
hobby玩儿
=======Teacher=======
name健康哥哥
sex男
salary8000.0