2022.4.20 反射动态获取配置文件与利用反射保存对象中的信息
反射和配置文件结合动态获取的练习(重点)
需求: 利用反射根据文件中的不同类名和方法名,创建不同的对象并调用方法。
分析:
①通过Properties加载配置文件
②得到类名和方法名
③通过类名反射得到Class对象
④通过Class对象创建一个对象
⑤通过Class对象得到方法
⑥调用方法
代码示例:
prop.properties
1 classname=com.xing.myreflect.Teacher 全类名 2 method=teach 这个类下面要调用的方法
Teacher
1 package com.xing.reflect.demo02; 2 3 import lombok.AllArgsConstructor; 4 import lombok.Data; 5 import lombok.NoArgsConstructor; 6 7 @Data 8 @AllArgsConstructor 9 @NoArgsConstructor 10 public class Teacher { 11 private String name; 12 private int salary; 13 14 public void teach(){ 15 System.out.println("老师在教书!"); 16 } 17 18 }
MyReflectDemo
1 package com.xing.reflect.demo02; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.lang.reflect.Constructor; 6 import java.lang.reflect.InvocationTargetException; 7 import java.lang.reflect.Method; 8 import java.util.Properties; 9 10 /* 11 反射可以跟配置文件结合的方式,动态的创建对象,并调用方法 12 */ 13 public class MyReflectDemo { 14 public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { 15 16 //1.读取配置文件中的信息 17 Properties prop = new Properties(); 18 FileInputStream fis = new FileInputStream("myreflect\\prop.properties"); 19 prop.load(fis); 20 fis.close(); 21 System.out.println(prop);//{classname=com.xing.myreflect.Teacher,method=teach} 22 23 //2.获取全类名和方法名 properties 中等号两边是键值对的形式 24 String className = (String) prop.get("classname"); 25 String methodName = (String) prop.get("method"); 26 27 System.out.println(className);//com.xing.myreflect.Teacher 28 System.out.println(methodName);//teach 29 30 //3.利用反射创建对象并运行方法 31 Class<?> clazz = Class.forName(className); 32 33 //获取构造方法 34 Constructor<?> con = clazz.getDeclaredConstructor(); 35 //通过构造方法创建这个对象 36 Object o = con.newInstance(); 37 System.out.println(o);//Teach{name = null,salary = 0} 38 39 //获取成员方法并运行 40 Method method = clazz.getDeclaredMethod(methodName); 41 method.setAccessible(true); 42 //o这个对象去调用method代表的方法 43 method.invoke(o);//老师在教书! 44 45 46 } 47 } 48 49 50
利用发射保存对象中的信息(重点)
Student
1 package com.xing.reflect; 2 3 4 import lombok.AllArgsConstructor; 5 import lombok.Data; 6 import lombok.NoArgsConstructor; 7 8 @Data 9 @NoArgsConstructor 10 @AllArgsConstructor 11 public class Student { 12 private String name; 13 private int age; 14 private char gender; 15 private double height; 16 private String hobby; 17 }
MyReflectDemo
1 package com.xing.reflect; 2 3 import java.io.BufferedWriter; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 import java.lang.reflect.Field; 7 8 /* 9 对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去 10 */ 11 public class MyReflectDemo { 12 public static void main(String[] args) throws IllegalAccessException, IOException { 13 14 Student s = new Student("小A",23,'女',167.5,"睡觉"); 15 saveObject(s); 16 } 17 18 //把对象里面所有的成员变量名和值保存到本地文件中 19 public static void saveObject(Object obj) throws IllegalAccessException, IOException { 20 //1.获取字节码文件的对象 21 Class<?> clazz = obj.getClass(); 22 //2. 创建IO流 23 BufferedWriter bw = new BufferedWriter(new FileWriter("myreflect\\a.txt")); 24 //3. 获取所有的成员变量 25 Field[] fields = clazz.getDeclaredFields(); 26 for (Field field : fields) { 27 field.setAccessible(true); 28 //获取成员变量的名字 29 String name = field.getName(); 30 //获取成员变量的值 (获取obj这个对象中 field代表的成员变量的值) 31 Object value = field.get(obj); 32 //写出数据 33 bw.write(name + "=" + value); 34 // 换行 35 bw.newLine(); 36 } 37 bw.close(); 38 39 } 40 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)