学习反射(反射的使用,反射的应用场景)

目录

反射的使用

总的测试代码如下

反射的应用场景


反射的使用

大家先看一个案例

有一个person 类 属性有 String 类型的 name ,int age  ,还有一个 方法 a。

package fs;public class Person {private String name;private int age;public void a(){System.out.println("做一个 person");}
}

有一个Student 类 属性有 String 类型的 name ,gerder  ,还有一个方法 a

package fs;public class Student {
String name;
String gerder;public void a(){System.out.println("做一个student");}
}

要求是 调用其中一个 对象的方法或属性【注意我们没有具体指定是哪一个对象】 

一般写法如下

1 写一个测试类

2 简单的new 一个对象 ,再 调用它的方法或属性

    new Student().a();new Person().a();

3 看具体需要哪个,不需要的直接注释掉就行了。

但现实情况是 有很多个类,这时候如果把不需要的直接注释掉,那样操作太繁琐了。

怎么才可以不改动自己原本写的代码情况下,调用类的方法 那么这时候应该怎么做呢?

这时候需要使用到我们复习的反射了 ,基于本案例 使用反射解决,基本步骤如下:

  • 写配置文件,内容包括类名路径,方法名
  • 加载配置文件 ,调用方法获取 配置文件内容
  • 类加载器加载
  • 获取创建的类对象
  • 调用方法

具体步骤如下

1 写配置文件,内容包括类名路径,方法名

1.1  创建一个配置文件 一般是config.properties 在src 下的resource目录下 放置

为什么要放在resource目录下?

原因

  • resource目录下,是专门放置资源文件的【这里的资源文件常指的各种配置文件】
  • 我们之后使用的 getBundle()方法加载配置文件 指定目录也是在resource目录下的

1.2 配置文件需要有 类的路径和方法名

注意: 在配置文件中,写法多以键值对的形式书写: key=value 或 key :value 

  • 这里我就拿 Student 类举例,如果要的是,Person 类,相信大家也清楚如何修改

2 加载配置文件 ,调用方法获取 配置文件内容

2.1 在测试类中 调用  getBundle()参数为 配置文件名 获取加载配置文件对象

  ResourceBundle config = ResourceBundle.getBundle("config");

2.2 调用getString()方法 ,参数为 key值

       String className = config.getString("className");String methodName = config.getString("methodName");

3类加载器加载

3.1 获得类加载器器对象,参数为 通过上一步获得代表类路径的value值

  Class<?> aClass = Class.forName(className);

3.2通过调用 newInstance()方法获取创建的类对象

 Object obj = aClass.newInstance();

4 调用方法

       Method method = aClass.getMethod(methodName);method.invoke(obj);

最后运行结果如下

  • 那么如果我要改成Person 类的,是不是只需要修改配置文件就可以了

总的测试代码如下

 // 加载配置文件ResourceBundle config = ResourceBundle.getBundle("config");String className = config.getString("className");String methodName = config.getString("methodName");Class<?> aClass = Class.forName(className);// 创建类的对象Object obj = aClass.newInstance();Method method = aClass.getMethod(methodName);method.invoke(obj);

反射的应用场景

大家看之前,通过反射来完成,是不是更加麻烦了。之前就只要写两行代码,不需要的就注释掉。似乎这种方式更加方便!,但事实真的是这样吗?

疑问

1.1 学习反射有意义吗

首选我要告诉大家,我们真正手写反射的概率很少。但反射无处不在!特别是在我们学习各种框架后,关于反射的思想,就藏在各种细节中 。因此我们很有必要学习反射。

1.2 反射在我们实际工作中会真正遇到吗

举一个例子,你做了一个项目,现在项目正在部署上线,但发现还有些细节部分需要调整,但这时候如果去修改源代码的化,就来不及了,如果修改源代码还要二次测试。因此我们只在配置文件中添加一些修改,这里就具体使用到反射。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在ESP32使用AT指令集与服务器进行TCP/IP通信时,<link ID> 解释

在ESP32使用AT指令集与服务器进行TCP/IP通信时&#xff0c;<link ID> 是一个非常重要的参数。它用于标识不同的连接实例&#xff0c;特别是在多连接场景下&#xff08;如同时建立多个TCP或UDP连接&#xff09;。每个连接都有唯一的<link ID>&#xff0c;通过这个ID…

Ansible 批量管理华为 CE 交换机

注&#xff1a;本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地&#xff1a;贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具&#xff0c;AnsibleWorks 成立于 2012 年&a…

【python虚拟环境安装】linux centos 下的python虚拟环境配置

linux centos 下的python虚拟环境配置 在 CentOS 环境中处理 pip 安装警告的方法1. 创建并使用虚拟环境2. 忽略警告并继续使用 root 用户安装&#xff08;不推荐&#xff09;报错问题处理 在 CentOS 环境中处理 pip 安装警告的方法 当在 CentOS 环境中遇到 pip 安装警告时&…

【Datawhale AI 冬令营】如何动手微调出自己的大模型

目录 总体思路实操案例数据集构造收集数据数据构造 模型微调选择模型选择数据集参数配置开始训练 模型使用 总体思路 微调大模型主要以开源的通用大模型为基础&#xff0c;喂给模型自己准备的数据&#xff0c;将通用的大模型往自己想要的方向引导&#xff0c;变成更偏向某一领…

Python编程常用的19个经典案例

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1. 列表推导式 fizz_buzz_list ["FizzBuzz" if i % 15 0 else "Fizz" if i % 3 0 else "Buzz…

关于数据流图绘制和使用上的一些个人经验

假设我们需要开发一个项目进度管理系统&#xff0c;在这个项目进度管理系统之中&#xff0c;我们需要开发一个功能&#xff1a;项目成员的列表。我们具有这样的业务需求&#xff1a; 在项目进度管理系统中&#xff0c;我们需要知道参与项目的人员到底有哪些&#xff0c;并且项目…

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定&#xff1a;为了获取相机与机器人坐标系之间得位姿转换关系&#xff0c;需要对相机和机器人坐标系进行标定&#xff0c;该标定过程成为手眼标定&#xff0c;用于存储这一组转换关系的文件称为手眼标定文件。 ETH&#xff1a;即Eye To …

AlipayHK支付宝HK接入-商户收款(PHP)

一打开支付宝国际版 二、点开商户服务 三、下载源码

基于Arduino的平衡车机械臂

两轮驱动机器人车与机械臂的DIY指南 视频&#xff1a; 基于Arduino的平衡车机械臂 资料下载链接 引言 在这篇文章中&#xff0c;我们将一起探索如何构建一个两轮驱动的机器人车&#xff0c;并配备有一个机器人臂&#xff0c;这个项目适合初学者&#xff0c;并且可以在动态环…

【练习Day20】字符串变形

链接&#xff1a;字符串变形_牛客题霸_牛客网 方法一&#xff1a;双逆转&#xff08;推荐使用&#xff09; 思路&#xff1a; 将单词位置的反转&#xff0c;那肯定前后都是逆序&#xff0c;不如我们先将整个字符串反转&#xff0c;这样是不是单词的位置也就随之反转了。但是单…

ip地址和网络号关系是什么

在浩瀚的网络世界中&#xff0c;每一个连接互联网的设备都需要一个独特的标识来确保数据的准确传输。这个标识就是IP地址。然而&#xff0c;在深入探索IP地址的同时&#xff0c;我们不得不提及一个与之紧密相关的概念——网络号。网络号与IP地址之间存在着怎样的联系与区别&…

android 登录界面编写

1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候&#xff0c;验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时&#xff0c;使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…

run postinstall error, please remove node_modules before retry!

下载 node_modules 报错&#xff1a;run postinstall error, please remove node_modules before retry! 原因&#xff1a;node 版本出现错误&#xff0c;我的项目之前是在 12 下运行的。解决方法&#xff1a; 先卸载node_modules清除缓存将node版本切换到12重新下载即可

Docker 安装 禅道-21.2版本-外部数据库模式

Docker 安装系列 1、拉取最新版本&#xff08;zentao 21.2&#xff09; [rootTseng ~]# docker pull hub.zentao.net/app/zentao Using default tag: latest latest: Pulling from app/zentao 55ab1b300d4b: Pull complete 6b5749e5ef1d: Pull complete bdccb03403c1: Pul…

visual studio 2022 c++使用教程

介绍 c开发windows一般都是visual studio&#xff0c;linux一般是vscode&#xff0c;但vscode调试c不方便&#xff0c;所以很多情况都是2套代码&#xff0c;在windows上用vs开发方便&#xff0c;在转到linux。 安装 1、官网下载vs2022企业版–选择桌面开发–安装位置–安装–…

python学opencv|读取图像(十七)认识alpha通道

【1】引言 前序学习进程中&#xff0c;我们已经掌握了RGB和HSV图像的通道拆分和合并&#xff0c;获得了很多意想不到的效果&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图像转HSV图像-CSDN博客 python学opencv|读…

设计模式--单例模式【创建型模式】

设计模式的分类 我们都知道有 23 种设计模式&#xff0c;这 23 种设计模式可分为如下三类&#xff1a; 创建型模式&#xff08;5 种&#xff09;&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff08;7 种&#xff09;&#xff1…

neo4j 图表数据导入到 TuGraph

neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库&#xff0c;需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出&#xff0c;但因为格式和数据库设计问题&#xff0c;操作起来比较麻烦&#xff08;可能是个人没…

模具生产过程中的标签使用流程图

①NFC芯片嵌入周转筐&#xff0c;通过读卡器读取CK_Label_v3的数据&#xff0c;并将这些信息上传至服务器进行存储&#xff1b; ②服务器随后与客户的WMS&#xff08;仓库管理系统&#xff09;进行交互&#xff0c;记录和同步注塑机的原始数据&#xff1b; ③当周转筐内的模具…

Linux线程同步

1 线程同步概念 假设有有三个线程A,B,C&#xff0c;当前一个线程A对内存中的共享资源进行访问时&#xff0c;其它线程B&#xff0c;C都不可以对这块内存进行操作&#xff0c;直到线程A对这块内存访问完毕为止&#xff0c;B&#xff0c;C中的一个才能访问这块内存&#xff0c;剩…