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

news/2024/5/19 5:44:20 标签: java, 反射

需求

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

实现代码

java">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.properties
        Properties 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];

            // 将属性的访问设置为true
            field.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的属性对象后,用“.”(点)进行分割时,需要转义,即“\\.”,不然分割不出效果

java">	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类型

java">	// 如果该对象的某个属性是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.niftyadmin.cn/n/361076.html

相关文章

学习Java可以从事什么岗位(合集)

学习Java可以从事什么岗位 学习Java可以从事的岗位 Java可以做网站 Java可以用来编写网站,现在很多大型网站都用Jsp写的,JSP全名Java Server Pages 它是一种动态网页技术,比如我们熟悉的163,一些政府网站都是采用JSP编写的。 所以…

《面试1v1》ThreadLocal

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你好,请问你对 ThreadLocal 有了解吗? 候选人: 您好,我知道 ThreadLocal 是一个 Java 中的类&a…

【Linux】进程控制 — 进程程序替换 + 实现简易shell

文章目录 📖 前言1. 进程程序替换1.1 程序替换的概念:1.2 为什么要程序替换:1.3 程序替换的原理: 2. 六个exec替换函数2.1 execl函数:2.2 execv函数:2.3 execlp函数:2.4 execvp函数:…

渗透攻防需要实践资料统计

书籍 1、Metasploit 渗透测试指南 2、网络攻防技术与实践 3、0day 安全:软件漏洞分析技术(第2版) 4、Wireshark数据包分析实战(第2版) 5、IDAPro权威指南 6、网络扫描技术揭秘:原理、实践与扫描器的实现 7、Nmap Network ScanningNmap Network Scanning Edition 2 8、Googl…

Spring Cloud Alibaba 快速上手搭建公司项目(二)Nacos

Nacos(全称为:阿里巴巴开源项目 - 命名服务 & 配置中心)是阿里巴巴集团开源的一个动态服务发现、配置管理和服务管理平台。它提供了一种简单易用的方式来管理和监控微服务应用程序中的服务实例、配置和元数据。 Nacos是一个高度可扩展的平台,支持多…

快速理解会话跟踪技术Cookie和Session

文章目录 会话跟踪技术客户端会话跟踪技术Cookie服务端会话跟踪技术Session 会话跟踪技术 会话:客服端和服务端的多次请求与响应称为会话。 会话跟踪:服务器需要识别多次请求是否来自同一浏览器,在同一次会话多次请求中共享数据。 HTTP协议是…

利用qsort排序

一、简单排序10个元素的一维数组 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<stdlib.h> void print_arr(int arr[], int sz) {int i 0;for (i 0; i < sz; i){printf("%d ", arr[i]);}printf("…

图像算法工程师岗位的主要职责(合集)

图像算法工程师岗位的主要职责 一、确定岗位的职责 1.根据工作任务的需要确立工作岗位名称及其数量; 2.根据岗位工种确定岗位职务范围; 3.根据工种性质确定岗位使用的设备、工具、工作质量和效率; 4.明确岗位环境和确定岗位任职资格; 5.确定各个岗位之间的相互关系; 6.根据岗位…