当前位置:网站首页>利用反射实现一个管理对象信息的简单框架
利用反射实现一个管理对象信息的简单框架
2022-07-31 19:30:00 【热爱编程的小宇】
利用反射实现一个管理对象信息的简单框架
看实现的效果:
然后运行我们的代码,它能够按照我们配置文件声明的类和属性去创造对应的实例
更改配置文件的信息:
对应的结果:
实现步骤:
首先通过Class类的**getResourceAsStream()**方法去获取一个文件的输入流
Properties properties = new Properties();
InputStream resourceAsStream = MySpring.class.getResourceAsStream(PROPRETIES_PATH);
首先通过Properties类来加载文件中的信息——包含类的全限定名、属性值
properties.load(resourceAsStream);
String className = properties.getProperty("className");
Set<Object> keySet = properties.keySet();
利用反射去加载文件中指定的类,并取得实例
Class<?> loadClass = Class.forName(className);
Object o = loadClass.newInstance();
通过反射获取类中所有的属性,并进行赋值
Field[] fields = loadClass.getDeclaredFields();
Arrays.stream(fields).filter(field -> keySet.contains(field.getName())).forEach(field -> {
field.setAccessible(true);
try {
field.set(o, properties.getProperty(field.getName()));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
});
代码整合
我的Person类
package com.zky.pojo;
/** * @authoer:zky * @createDate:2022/7/30 * @description: */
public class Person {
private String name;
private String age;
private String address;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", address='" + address + '\'' +
'}';
}
}
我的School类
package com.zky.pojo;
/** * @authoer:zky * @createDate:2022/7/30 * @description: */
public class School {
private String name;
private String level;
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", level='" + level + '\'' +
'}';
}
}
实现类
package com.zky.myframe;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
/** * @authoer:zky * @createDate:2022/7/30 * @description: */
public class MySpring {
public static final String PROPRETIES_PATH = "application.propreties";
public static void main(String[] args) throws Exception {
Object o = beanFactory();
System.out.println(o);
}
public static Object beanFactory() throws Exception {
//读取配置文件的信息
Properties properties = new Properties();
InputStream resourceAsStream = MySpring.class.getResourceAsStream(PROPRETIES_PATH);
properties.load(resourceAsStream);
String className = properties.getProperty("className");
//TODO 修改为自动获取属性信息
Set<Object> keySet = properties.keySet();
//利用反射加载对应的类
Class<?> loadClass = Class.forName(className);
Object o = loadClass.newInstance();
Field[] fields = loadClass.getDeclaredFields();
Arrays.stream(fields).filter(field -> keySet.contains(field.getName())).forEach(field -> {
field.setAccessible(true);
try {
field.set(o, properties.getProperty(field.getName()));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
});
return o;
}
}
待优化:
目前属性只支持String类型的属性,其它属性等我有空再写~ 感觉不是很好弄。
目前只能管理对象一个对象,多个对象有待实现
边栏推荐
猜你喜欢
Three. Introduction to js
The whole network is on the verge of triggering, and the all-round assistant for content distribution from media people - Rongmeibao
MySQL - multi-table query
Short-circuit characteristics and protection of SiC MOSFETs
All-platform GPU general AI video supplementary frame super-score tutorial
Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...
【码蹄集新手村600题】通向公式与程序相结合
第七章
关注!海泰方圆加入《个人信息保护自律公约》
中文编码的设置与action方法的返回值
随机推荐
Short-circuit characteristics and protection of SiC MOSFETs
Cache and Database Consistency Solutions
第六章
MySQL---aggregate function
Architecture Battalion Module 8 Homework
iNeuOS工业互联网操作系统,设备运维业务和“低代码”表单开发工具
cas与自旋锁(轻量级锁就是自旋锁吗)
INeuOS industrial Internet operating system, the equipment operational business and "low code" form development tools
关注!海泰方圆加入《个人信息保护自律公约》
MySQL---Subqueries
pytorch lstm时间序列预测问题踩坑「建议收藏」
npm 更改为淘宝镜像的方法[通俗易懂]
Thymeleaf是什么?该如何使用。
MySQL - multi-table query
SiC MOSFET的短路特性及保护
【AcWing】第 62 场周赛 【2022.07.30】
有一说一,外包公司到底值不值得去?
MySQL---operator
How to change npm to Taobao mirror [easy to understand]
架构师04-应用服务间加密设计和实践