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 }
复制代码

 

 
posted @   暴躁C语言  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示