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

这篇具有很好参考价值的文章主要介绍了用反射设计通用的实例化对象方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

对象的相关信息存储在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.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的属性对象后,用“.”(点)进行分割时,需要转义,即“\\.”,不然分割不出效果

	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文件,不免有些麻烦。文章来源地址https://www.toymoban.com/news/detail-464516.html

到了这里,关于用反射设计通用的实例化对象方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 综合布线实例 基于酒店的综合布线系统设计方案

    在网络发展飞快的现代,智能建筑已成为代表建筑高科技含量的代名词,人们居住条件的提高和办公环境的改善,无疑对建筑物的智能化提出了更新、更高的要求,综合布线系统是一个能够支持用户选择的语音/数据/图形图像应用的网络布线系统,为其智能化的实现提供了一

    2024年02月07日
    浏览(41)
  • 35、WEB攻防——通用漏洞&XSS跨站&反射&存储&DOM&盲打&劫持

    XSS产生于前端的漏洞,常产生于: XSS分类: 反射型(非持久型) 存储型(持久型),攻击代码被写入数据库中。常见于:写日志、留言、评论的地方 DOM型 DOM型XSS与反射型XSS、存储型XSS的最大区别在于:DOM型XSS前端的数据是传输给前端JS代码进行处理,而反射型XSS、存储型

    2024年01月25日
    浏览(72)
  • C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例

    本文档写的的是C#中的反射常用的方式(附带示例代码)以及在使用的时候的一些注意事项。 C#中的反射是一种强大的机制,它允许在运行时动态地检查、访问和操作程序的元数据、类型信息和对象。以下是C#中反射常用的技巧和使用方式: 获取类型信息:使用Type类可以获取

    2024年02月06日
    浏览(48)
  • Java 中反射的概念、作用和特点,在什么情况下使用反射及使用实例

    反射(Reflection)是 Java 的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依然能够实例化对象,调用方法以及设置属性。 反射的作用有以下几点: 运行时探查类

    2024年02月06日
    浏览(47)
  • java通过反射创建反射对象三种的方法

    目录 前言: 代码部分: computer类: 1.类名.class创建反射对象: 2.对象.getclass创建反射对象: 3.Class.forName(\\\"\\\")创建反射对象: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态

    2024年02月14日
    浏览(36)
  • 【Java反射】Java利用反射获取和设置对象某属性的值

    通用工具类: 测试:

    2024年02月02日
    浏览(54)
  • 使用Java反射针对对象字段比较。

    在Java开发中,我们经常需要比较两个对象的字段差异,尤其是在处理数据同步、状态更新等场景中。本文介绍了如何使用Java反射和Stream API优化对象字段比较的过程。 类型检查 : 确保传入的两个对象属于同一类型,否则抛出异常。 使用Stream API : 利用Stream API和Lambda表达式简化

    2024年04月14日
    浏览(31)
  • Java 反射设置/获取对象属性值

    ✨大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城狮!✨ 欢迎对【Java】感兴趣的大佬,关注我 😜 ———————————————— ❤️ ❤️ ❤️ 如果觉得本文还不错,点赞 + 评论 + 关注 + 收藏。有补充欢迎评论交流,我将努力创作更多更好的文章。 大佬们的支持

    2024年02月07日
    浏览(51)
  • 反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )

    反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以 为集合存入其他任意类型的元素的 。 泛型只是在编译阶段可以约束集合只能操作某种数据类型,在 编译成Class文件进入 运行阶段 的时候,其真实类型都是不带泛型的集合,泛型相当于被擦除了。

    2024年02月08日
    浏览(42)
  • 2. 软件需求 & 面向对象分析

    目录 1. 软件需求 1.1 需求分类 1.2 需求获取 1.3 需求分析 2. 面向对象分析(OOA) 2.1 统一建模语言 UML 2.2 用例模型 2.2.1 用例图的元素  2.2.2 识别参与者 2.2.3 合并需求获得用例 2.2.4 细化用例描述 2.3 分析模型 2.3.1 定义概念类 2.3.2 确定类之间的关系 2.3.3 为类添加职责 1. 软件需求

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包