加载配置文件内容利用反射动态创建对象和调用方法(开闭原则的体现)

news2025/7/14 13:04:39

反射的应用:根据配置文件来创建对象和调用方法

需求:1,根据配置文件re.properties 指定的信息,创建对象并调用方法
classfullpath=src.com.liu.Cat
method=hi
即通过外部文件配置,在不修改源码的情况下,来控制程序,
当method=hi变成了method=cry时,不修改代码也可以正常运行达到我们想要的效果
(这符合设计模式的 ocp 原则即开闭原则:对修改权限进行关闭,对拓展功能进行开放

1.传统的做法

通过传统的 new 一个对象 然后通过new出的对象点方法来调用方法
Cat cat = new Cat();
cat.hi();
弊端: 当想要调用的方法发生改变时例如此刻我想调用cry()方法不再调用hi()方法,就必须要把cat.hi()方法修改成cat.cry()。这修改了源码,不符合开闭原则

2.读取配置文件,通过配置文件里的路径来new一个对象

    Properties properties = new Properties();
    properties.load(new FileInputStream("src/com/liu/re.properties"));
    String classfullpath = properties.get("classfullpath").toString();
    String methodName = properties.get("method").toString();
    System.out.println("classfullpath="+classfullpath);
    System.out.println("method="+methodName);
    // 传统的方式不行
    new classfullpath();//classfullpath 是String 类型,不是全路径

可以看到下图中编译不通过因为classfullpath 是String 类型,不是全路径在这里插入图片描述

3.通过反射来解决2中出现的这个问题

    //三,使用反射机制来解决
    Class cls = Class.forName(classfullpath);
    Object o = cls.newInstance();
    System.out.println("o 的运行时类型= "+o.getClass());
    Method method1 = cls.getMethod(methodName);
    //通过method1调用方法,即通过方法对象调用方法
    method1.invoke(o);

运行结果如下:在这里插入图片描述
当修改re.properties,把method变成cry时
在这里插入图片描述
运行结果:
在这里插入图片描述
可以看出,这实现了在不修改源码的情况下只需要修改配置文件,就能实现当方法改变时,程序也能跟着改变

4.文件夹结构与代码

在这里插入图片描述

Cat.java

package src.com.liu;

public class Cat {
    private String name = "招财猫";
    public void hi(){
        System.out.println("hi"+name);
    }
    public void cry(){
        System.out.println(name+"喵喵叫");
    }
}


re.properties

classfullpath=src.com.liu.Cat
method=hi
#method=cry

ReflectionQuestion.java

package src.com.liu.reflection.question;

import src.com.liu.Cat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //根据配置文件 re.properties 指定信息,创建Cat 对象并调取方法hi

        //一,传统的方法 new 对象 -》 方法调用
        Cat cat = new Cat();
        cat.hi();

        // 二,. 使用 Properties 类,可以读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/com/liu/re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        System.out.println("classfullpath="+classfullpath);
        System.out.println("method="+methodName);
        // 传统的方式不行
        //new classfullpath();//classfullpath 是String 类型,不是全路径

        //三,使用反射机制来解决
        Class cls = Class.forName(classfullpath);
        Object o = cls.newInstance();
        System.out.println("o 的运行时类型= "+o.getClass());
        Method method1 = cls.getMethod(methodName);
        //通过method1调用方法,即通过方法对象调用方法
        method1.invoke(o);
        //如果是传统的做法我要求调用 cry方法,而不是调用 hi方法,
        //Cat cat = new Cat(); cat.hi();====> cat.cry();需修改源码

        //使用反射的 做法是: 把配置文件re.properties 的 method=hi,改成method=cry就可以了,
        //只修改配置文件,不修改源代码


    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GAN详解

前言 GAN是当今作为火热的生成式算法,由Ian Goodfellow,Yoshua Bengio等人在2014年提出的,Yan LeCun表示道GAN是“adversarial training is the coolest thing since sliced bread”。它使用两个神经网络,将一个神经网络与另一个…

ArcGIS中ArcMap栅格图层0值设置为NoData值的简便方法

本文介绍在ArcMap软件中,将栅格图层中的0值或其他指定数值作为NoData值的方法。 在处理栅格图像时,有时会发现如下图所示的情况——我们对某一个区域的栅格数据进行分类着色后,其周边区域(即下图中浅蓝色的区域)原本应…

C语言学习记录(十五)C预处理器和C库

文章目录一、C预处理器1.1 翻译程序1.2 明示常量:#define1.3 在#define中使用参数1.4 文件包含:#include1.5 其他指令1.5.1 #undef指令1.5.2 从C预处理角度看已定义1.5.3 条件编译1.5.3.1 #ifdef、#else和#endif指令1.5.3.2 #ifndef1.5.3.3 #if和elif指令…

Gof23-创建型-工厂-单例-抽象工厂-建造-原型以及UML的绘制

创建型的设计模式工厂模式单例模式抽象工厂建造者模式原型模式UML图形的绘制工厂模式 工厂模式 Factory Pattern 适用的场景:统一的接口作为统一的零件,实现类作为零件的组合,将实例产品类的生产交给工厂,用户只需要面对工程提取…

XML的创建和读取

rapidxml是一个快速的xml库,由C模板实现的高效率xml解析库,同时也是boost库的property_tree的内置解析库。 当使用rapidxml时,只需要把rapidxml.hpp 、 rapidxml_print.hpp 和 rapidxml_utils.hpp 三个文件拷贝到你的工程目录下,就…

Pytorch中KL loss

1. 概念 KL散度可以用来衡量两个概率分布之间的相似性,两个概率分布越相近,KL散度越小。 上述公式表示P为真实事件的概率分布,Q为理论拟合出来的该事件的概率分布。D(P||Q)(P拟合Q)和D(Q||P)(Q拟合P&…

ajax之Content-Type示例

参考资料: Content-Type详解【SpringBoot】SpringBoot接收请求的n种姿势 目录前期准备0. Content-Type概念解释1. application/x-www-form-urlencoded1.1 form表单示例1.2 jQuery的ajax示例2. application/json2.1 指定contentType为json,不使用RequestBody接收2.2 不指定cont…

01 OSI七层网络排查 troubleshooting 思路及对应工具

文章目录1 .前言2. OSI 的七层模型,和 TCP/IP 的四层 / 五层模型区别2.1 网络专业术语2.2 TLS 解释2.3 什么是TCP 流?3. 网络各层排查工具3.1 应用层3.1.1 浏览器的开发者工具3.1.1.1 找到有问题的服务端IP3.1.1.2 辅助排查网页慢的问题3.1.1.3 解决失效…

嵌入式数据库sqlite3

一、数据库 数据库的基本概念 常用的数据库 大型数据库 Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。 IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支…

bootstrap学习(四)

bootstrap中图片、按钮、表单 按钮: 不加样式的按钮: 在bootstrap中a标签也可以生成按钮: 默认按钮尺寸可以不加,它是自动显示默认尺寸 加btn-block:class 图片: 表单: 垂直表单:…

【语音识别】MFCC+VAD端点检测智能语音门禁系统【含GUI Matlab源码 451期】

⛄一、MFCC简介 1 引言 语音识别是一种模式识别, 就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。语音识别技术主要包括特征提取技术、模式匹配准则及模型训练技术3个方面。目前一些语音识别系统的适应性比较差, 主要体现在对环境依赖性强, 因此要提高…

[mysql] 深入分析MySQL版本控制MVCC规则--实测 (mysql 8.0 innodb引擎)

背景:基于之前的一篇文章 可重复读:可重复读隔离级别的实现是每个事务在打开时都会生成一个一致的视图。 当其他事务提交时,不会影响当前事务中的数据。 为了保证这一点,MySQL是通过多版本控制机制MVCC来实现的; 我们亲…

Go语言面试题合集(2022)

基础语法 Go 支持默认参数或可选参数吗? 不支持。但是可以利用结构体参数,或者…传入参数切片数组。 // 这个函数可以传入任意数量的整型参数 func sum(nums ...int) {total : 0for _, num : range nums {total num}fmt.Println(total) }Go 语言 tag…

pandas算术运算、逻辑运算、统计运算describe()函数、统计函数、累计统计函数及自定义函数运算

一、pandas算术运算 直接对数据进行加、减、乘、除等运算,可使用函数add()、sub()、mul()、div()或、-、、 代码如下 数据生成 import pandas as pd import numpy as np# 数据生成代码 num np.random.randint(50, 100, (3, 5))# 传入标签索引 column [第一列, …

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件①

👨‍🎓👨‍🎓博主:发量不足 个人简介:耐心,自信来源于你强大的思想和知识基础!! 📑📑本期更新内容:安装Hadoop、配置Hadoop 配置文件…

基于SSM的高校课程评价系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

一文带你深入理解【Java基础】· 注解

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

多线程编程【条件变量】

条件变量📖1. 为什么需要条件变量?📖2. 条件变量概念📖3. 发信号时总是持有锁📖4. 生产者消费者问题📖5. 基于阻塞队列的生产者消费者模型📖1. 为什么需要条件变量? 在很多情况下&a…

Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ~~~ 一、铃声播放 虽然媒体播放器MediaPlayer既可用来播放视频,也可以用来播放音频,但是在具体的使用场合,MediaPlayer存在某些播音方面的不足之处 包括以下几点 1:初始化比较消耗资源 尤其…

软件开发工程师笔试记录--关键路径,浮点数计算,地址变换,中断向量,I/O接口,海明码

时间:2022年11月26日 10:00 -11:00 (可提前登录15分钟) 公司:XX(rongyu) 岗位:软件开发工程师(我的简历语言是Java) 题型:选择题&…