Java 反射作用与应用场景

1585364631
2023-02-20 / 0 评论 / 129 阅读 / 正在检测是否收录...

Java 反射作用与应用场景

反射的作用

  • 基本使用:可以得到一个类的全部成分然后操作
  • 可以破坏封装性
  • 最重要的用途是:适合做java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能。

案例

使用反射做一个简易版的框架

  • 对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去。
    实现代码:
  public class frame {

    class Student{
        private String name;
        private int age;
        private char sex;
        private double height;
        private String hobby;

        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;
        }
    }

    class Teacher{
        private String name;
        private double salary;

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

    public static void save(Object obj) throws IllegalAccessException, FileNotFoundException {
        // 打开io文件写入流
        PrintStream printStream = new PrintStream(new FileOutputStream("1.txt",true));
        // obj 是任意对象,到底有多少个字段要保存
        Class c = obj.getClass();
        printStream.println("-----------" + c.getSimpleName() + "-----------");
        // 从这个类中提取它的全部成员变量
        Field[] fields = c.getDeclaredFields();
        // 遍历每个成员变量
        for (Field field : fields) {
            // 破坏权限检查
            field.setAccessible(true);
            // 取值
            String name = field.getName();
            String value = String.valueOf(field.get(obj));
            // 写入文件
            printStream.println(name + " = " + value);
        }
        // 关闭io文件写入流
        printStream.close();
    }

    public static void main(String[] args) throws NoSuchFieldException, FileNotFoundException, IllegalAccessException {
        System.out.println("创建学生变量");
        Student student = new frame().new Student("张三",18,'男',170.1,"学生");
        System.out.println("写入信息到文本");
        save(student);
        System.out.println("创建教师变量");
        Teacher teacher = new frame().new Teacher("李四",5000);
        save(teacher);
        System.out.println("写入信息到文本");
    }
}

执行结果

创建学生变量
写入信息到文本
创建教师变量
写入信息到文本

文本输出(1.txt)

-----------Student-----------
name = 张三
age = 18
sex = 男
height = 170.1
hobby = 学生
this$0 = Reflection.frame@b4c966a
-----------Teacher-----------
name = 李四
salary = 5000.0
this$0 = Reflection.frame@1d81eb93
0

评论 (0)

取消