当前位置:网站首页>利用反射实现一个管理对象信息的简单框架
利用反射实现一个管理对象信息的简单框架
2022-07-31 19:30:00 【热爱编程的小宇】
利用反射实现一个管理对象信息的简单框架
看实现的效果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pF8lOM4l-1659182788166)(D:\note\笔记仓库\图片\image-20220730195726510.png)]](/img/55/2599a43429251b9f96097ec2be1679.png)
然后运行我们的代码,它能够按照我们配置文件声明的类和属性去创造对应的实例
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dGinWU0-1659182788175)(D:\note\笔记仓库\图片\image-20220730195744424.png)]](/img/0e/bbb2d001e8166551c939bba113abb1.png)
更改配置文件的信息:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmaBKpw9-1659182788176)(D:\note\笔记仓库\图片\image-20220730200147432.png)]](/img/32/a53f95f839f07551814212c7782932.png)
对应的结果:
实现步骤:
首先通过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类型的属性,其它属性等我有空再写~ 感觉不是很好弄。
目前只能管理对象一个对象,多个对象有待实现
边栏推荐
猜你喜欢

OSPFv3的基本配置

ReentrantLock原理(未完待续)

What's wrong with the sql syntax in my sql

Poker Game in C# -- Introduction and Code Implementation of Blackjack Rules

STM32 full series development firmware installation guide under Arduino framework

Jiuqi ny3p series voice chip replaces the domestic solution KT148A, which is more cost-effective and has a length of 420 seconds

ResNet的基础:残差块的原理

基于STM32 环形队列来实现串口接收数据

The new telecom "routine", my dad was tricked!

leetcode:6135. 图中的最长环【内向基环树 + 最长环板子 + 时间戳】
随机推荐
MySQL---聚合函数
rj45对接头千兆(百兆以太网接口定义)
Unity 之 音频类型和编码格式介绍
广汽本田安全体验营:“危险”是最好的老师
第六章
财务盈利、偿债能力指标
全网一触即发,自媒体人的内容分发全能助手——融媒宝
架构师04-应用服务间加密设计和实践
MySQL---Create and manage databases and data tables
每月一书(202207):《Swift编程权威指南》
京东获取商品历史价格信息 API
linux查看redis版本命令(linux查看mysql版本号)
Linux环境redis集群搭建「建议收藏」
MySQL---Basic select statement
Apache EventMesh distributed event-driven multi-runtime
MySQL---子查询
Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...
Combinatorics Notes (6) Associative Algebra of Locally Finite Partially Ordered Sets, Möbius Inversion Formula
角色妆容的实现
淘宝/天猫获得淘口令真实url API