当前位置: 首页 > news >正文

用反射设计通用的实例化对象方案

需求

对象的相关信息存储在javabean.properties文件中,通过读取properties文件中的信息,实例化对象,要求程序不能硬编码,即程序可以通用,针对不同的对象,都可以实例化。仅需修改配置文件,不需要更改代码。
在这里插入图片描述

实现代码

import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Properties;/*** 实例化对象*/
public class AddInstance {public static void main(String[] args) throws Exception {// 读取本地javabean.propertiesProperties properties = new Properties();properties.load(new FileReader("C:\\Users\\1\\IdeaProjects\\javaSE\\javabean.properties"));// 根据javabean.properties中的className值获取对应的字节码对象Class className = Class.forName((String) properties.get("className"));// 获取构造器Constructor constructor = className.getConstructor();// 获取实例化对象Object obj = constructor.newInstance();// 获取所有的变量对象Field[] fields = className.getDeclaredFields();// 遍历变量对象for (Field field : fields) {// 分割变量对象,需要注意”.“需要转义String[] split = (field.toString()).split("\\.");// 获取属性名String attribute = split[split.length - 1];// 将属性的访问设置为truefield.setAccessible(true);// 定义Object对象Object o;// 如果该对象的某个属性是int类型if (field.getType() == int.class) {// 将从javabean.properties中获取到的对应的该值转为Integer类型o = Integer.parseInt((String) properties.get(attribute));} else {// 不是int类型,直接将取出javabean.properties中的值o = properties.get(attribute);}// 写入field.set(obj, o);}System.out.println("通过配置文件创建了对象,并赋值结果是:" + obj);}
}

在这里插入图片描述在这里插入图片描述

需要注意以下两点:
(1)获取javaBean的属性对象后,用“.”(点)进行分割时,需要转义,即“\\.”,不然分割不出效果

	System.out.println("------------------------------------------------------------");System.out.println(field.toString());String[] split = (field.toString()).split("\\.");System.out.println(Arrays.toString(split));String[] split1 = (field.toString()).split(".");System.out.println(Arrays.toString(split1));

在这里插入图片描述

(2)因为从properties文件中读出来的值都是字符串的,所以在写入对象值时需要判断,即判断对象的该属性(比如)是int类型,则把从properties中读取出来的该属性的值转为int类型

	// 如果该对象的某个属性是int类型if (field.getType() == int.class) {// 将从properties.properties中获取到的对应的该值转为Integer类型o = Integer.parseInt((String) properties.get(attribute));} else {// 不是int类型,直接将取出properties.properties中的值o = properties.get(attribute);}

总结和分析

通过反射和读取本地配置文件的方式来实例化对象,看似避免了“硬编码”,实例化不同对象不需要更改代码。但是,仍有以下几点麻烦之处:
(1)实例化不同的对象,需要更改配置文件的className值,即需要实例化javaBean的全类名;
(2)另外,如果javaBean属性中有非字符串类型的,则需要增加判断
(3)而且如果多个javaBean的实例化信息存放在properties内,不免会出现属性重复的情况。比如Person类有name属性,User类也有name属性,这时就需要创建多个properties文件,不免有些麻烦。

http://www.lryc.cn/news/90464.html

相关文章:

  • 破坏单例模式--存在的问题---问题的解决
  • SpringCloud微服务踩坑系列-java.lang.IllegalStateException
  • Linux-地址空间
  • 【EKS】基于Amazon EKS搭建kubernetes集群
  • Tomcat安装与启动和配置
  • ruoyi-vue版本(十八)创建自己的项目,使用若依里面的技术,多数据源的实现
  • C++-stack题型->最小栈,栈的压入与弹出,逆波兰表达式
  • 【计算机网络实验】BGP和OSPF协议仿真实验
  • 提升日期处理效率:day.js 实战经验分享
  • mysql中的count(1)、count(*)、count(id)哪个更快?
  • cf1750E Bracket Cost
  • Vue+springboot医院住院挂号登记收费系统7ui9s
  • 大前端之Koa2学习
  • Qml实现Dock浮动、停靠功能
  • 最新版本 Stable Diffusion 开源 AI 绘画工具之微调模型篇
  • 路径规划算法:基于哈里斯鹰优化的路径规划算法- 附代码
  • Web 应用程序防火墙 (WAF) 相关知识介绍
  • docker快速部署hue+hue集成hive
  • 基于java SpringBoot和Vue uniapp的校园信息交流小程序
  • 数据包伪造替换、会话劫持、https劫持之探索和测试
  • 正则表达式集合
  • Django框架中models对象转换为json的方法
  • 利用Servlet编写第一个“hello world“
  • python 爬虫之js逆向爬虫详解
  • SpringBoot:WebSocket实现消息撤回、图片撤回
  • 输出指定日期区间内的所有天、周、月
  • 【线性规划模型】
  • android 12.0卸载otg设备开机不加载otg设备
  • 通过 Wacom 的 Project Mercury 提高远程办公效率
  • Linux-0.11 文件系统namei.c详解