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)