Java的反射应用(Method和Class)
记录:473
场景:使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。
版本:JDK 1.8。
1.使用Java反射调用指定类的指定方法
(1)参数说明
String className, 字符串类型,需反射的类的全路径。
String methodName, 字符串类型,需反射的类的方法名称。
Object params,对象类型,反射调用方法的输入参数。
Object,返回值,反射调用方法的输出参数。
(2)代码实现
public class ReflectApplyUtils {/*** 根据类名称和方法名称执行指定类的指定方法* 获取public方法* Method[] method01 = clasz.getMethods();* 获取private方法* Method[] method02 = clasz.getDeclaredMethods();*/public static Object executeByName(String className, String methodName, Object params) {Object result = null;try {//1.根据类名称获取该类对应的Class对象Class<?> clasz = Class.forName(className);//2.根据方法名称获取改方法对应的Method对象Method method = null;for (Method var1 : clasz.getMethods()) {if (StringUtils.equals(var1.getName(), methodName)) {method = var1;break;}}//3.执行具体方法if (method != null) {//获取方法的Modifier值,在根据Modifier定义的常量可以判断方式是哪种类型int var2 = method.getModifiers();if (Modifier.isPublic(var2) && Modifier.isStatic(var2)) {result = method.invoke(clasz, params);} else if (Modifier.isPublic(var2) && !Modifier.isStatic(var2)) {result = method.invoke(clasz.newInstance(), params);} else {throw new Exception("提供的方法名称: " + methodName + ",不是public类型,无权限执行.");}} else {throw new Exception("根据方法名称: " + methodName + ",无法找到对应Method,请检查输入的方法名称是否正确.");}} catch (Exception e) {result = e;}return result;}
}
2.一个普通Java类
本示例中,将使用反射调用此类。
/*** java.lang.StringBuffer,线程安全(A thread-safe)* java.lang.StringBuilder,非线程安全*/
public class HostSportGames {public static String tableTennisContest(TeamDto team) {StringBuffer sb = new StringBuffer();sb.append("执行业务: ").append(team.getTeamName()).append(team.getGroup()).append("参加").append(team.getEvent()).append(",运动员:");StringBuffer finalSb = sb;team.getAthlete().forEach((item) -> {finalSb.append(item).append(",");});sb = sb.replace(sb.length() - 1, sb.length(), ".");System.out.println(sb);return "乒乓球比赛成功";}public String swimmingContest(TeamDto team) {StringBuilder sb = new StringBuilder();sb.append("执行业务: ").append(team.getTeamName()).append(team.getGroup()).append("参加").append(team.getEvent()).append(",运动员:");StringBuilder finalSb = sb;team.getAthlete().forEach((item) -> {finalSb.append(item).append(",");});sb = sb.replace(sb.length() - 1, sb.length(), ".");System.out.println(sb);return "游泳比赛成功";}private Object footballContest(TeamDto team) {System.out.println("暂无此赛事.");return "暂无此比赛";}
}
3.Java反射调用指定类的指定方法
(1)代码实现
public class ApplyReflect {public static void main(String[] args) {//1.数据准备TeamDto team01 = TeamDto.builder().teamName("中国乒乓球队").group("男子组").event("男单决赛").athlete(Arrays.asList("ZhangS", "ZhaoL")).build();TeamDto team02 = TeamDto.builder().teamName("中国游泳队").group("女子组").event("200米决赛").athlete(Arrays.asList("ZhangJ", "ZhaoX")).build();List<Object> task01 = Arrays.asList("com.hub.example.p11.reflect.work.HostSportGames","tableTennisContest", team01);List<Object> task02 = Arrays.asList("com.hub.example.p11.reflect.work.HostSportGames","swimmingContest", team02);List<List<Object>> taskList = Arrays.asList(task01, task02);//2.执行业务for (List<Object> taskItem : taskList) {try{System.out.println("*******************************");String className = (String) taskItem.get(0);String methodName = (String) taskItem.get(1);TeamDto params = (TeamDto) taskItem.get(2);Object executeResult = null;System.out.println("执行" + className + "的" + methodName + "方法.");System.out.println("输入参数: " + params.toString());executeResult = ReflectApplyUtils.executeByName(className, methodName, params);System.out.println("输出结果: " + executeResult);}catch (Exception e){System.out.println("执行异常.");e.printStackTrace();}}System.out.println("*******************************");}
}
(2)输出日志
*******************************
执行com.hub.example.p11.reflect.work.HostSportGames的tableTennisContest方法.
输入参数: TeamDto(teamName=中国乒乓球队, group=男子组, event=男单决赛, athlete=[ZhangS, ZhaoL])
执行业务: 中国乒乓球队男子组参加男单决赛,运动员:ZhangS,ZhaoL.
输出结果: 乒乓球比赛成功
*******************************
执行com.hub.example.p11.reflect.work.HostSportGames的swimmingContest方法.
输入参数: TeamDto(teamName=中国游泳队, group=女子组, event=200米决赛, athlete=[ZhangJ, ZhaoX])
执行业务: 中国游泳队女子组参加200米决赛,运动员:ZhangJ,ZhaoX.
输出结果: 游泳比赛成功
*******************************
4.辅助实体类
(1)说明
在实体类中使用注解@Data等来自lombok-1.18.24.jar。
(2)代码
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TeamDto implements Serializable {//球队名称private String teamName;//组别:男子组/女子组/混合组private String group;//比赛项目名称private String event;//团队成员private List<String> athlete;
}
以上,感谢。
2023年9月13日
相关文章:
Java的反射应用(Method和Class)
记录:473 场景:使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。 版本:JDK 1.8。 1.使用Java反射调用指定类的指定方法 (1)参数说明…...
Java之泛型系列--Class使用泛型的方法(有示例)
原文网址:Java之泛型系列--Class使用泛型的方法(有示例)_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍Java在方法前加泛型的使用。 类类型的写法 对象所对应的类的泛型写法 Class classAClass<T> classAClass<?> classB Class与Class<?&g…...
【【无用的知识之串口学习】】
无用的知识之串口学习 USART串口协议 •通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 •通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 就是我们并不能在芯片上设计完全部的一下子完成所有的设计&am…...
9月13日上课内容 第三章 ELK日志分析系统
本章结构 ELK日志分析系统简介 ELK日志分析系统分为 Elasticsearch Logstash Kibana 日志处理步骤 1.将日志进行集中化管理 2.将日志格式化(Logstash) 并输出到Elasticsearch 3.对格式化后的数据进行索引和存储 (Elasticsearch) 4.前端数据的展示(Kibana) Elasticsearch介…...
不知道有用没用的Api
encodeURIComponent(https://www.baidu.com/?name啊啊啊) decodeURIComponent(https%3A%2F%2Fwww.baidu.com%2F%3Fname%3D%E5%95%8A%E5%95%8A%E5%95%8A) encodeURI(https://www.baidu.com/?name啊啊啊) decodeURI(https://www.baidu.com/?name%E5%95%8A%E5%95%8A%E5%95%8A) …...
(2023,LENS 视觉模型 LLM)迈向可见的语言模型:通过自然语言的镜头来看计算机视觉
Towards Language Models That Can See: Computer Vision Through the LENS of Natural Language 公众号:EDPJ(添加 VX:CV_EDPJ 进交流群获取资料) 目录 0. 摘要 1. 简介 2. 相关工作 2.1 大语言模型能力 2.2 解决视觉和…...
线段树上树剖再拿线段树维护:0914T4
cp 一种常见套路: 如果在线段树上进行一段区间修改,那么必然是一段右节点一段左节点 这个过程其实就是zkw的本质 下面都要用zkw来理解 考虑原题,有一棵不规则的线段树 类似zkw,在这类题目中,我们要先把开区间变成闭…...
互联网医院系统|互联网医院探索未来医疗的新蓝海
随着互联网技术的飞速发展,互联网医院应运而生,为人们带来全新的医疗体验。本文将深入探讨互联网医院的开发流程、系统优势以及未来发展方向,带您领略医疗领域的新蓝海。互联网医院的开发流程是一个结合技术、医疗和用户需求的复杂过程。首先…...
Acrel-2000系列监控系统在亚运手球比赛馆建设10kV供配电工程中的应用
安科瑞 崔丽洁 摘要:智能化配电监控系统是数字化和信息化时代应运而生的产物,已经被广泛应用于电网用户侧楼宇、体育场馆、科研设施、机场、交通、医院、电力和石化行业等诸多领域的高/低压变配电系统中。安科瑞自研的Acrel-2000系列监控系统可监控高压开关柜、低压…...
c++中遇到一个不了解的函数,查看能用的接口功能
在C中,您可以使用几种方法来查找函数的接口和使用方式。下面是一些常用的方法: 查阅官方文档:每个常见的C库都应该配有官方文档,其中包含所有可用函数和其接口的详细说明。您可以从官方网站或下载的文档中查找所需函数的接口和使用…...
windows linux子系统 docker无法启动
windows安装Linux子系统后,使用sudo service docker start启动后,再使用sudo service docker status查看docker状态,docker无法启动,使用sudo dockerd查看错误信息如下: failed to start daemon: Error initializing …...
【Redis】深入探索 Redis 的数据类型 —— 无序集合 Set
文章目录 一、Set 类型介绍二、Set 类型相关命令2.1 添加元素和检查成员2.2 移除元素2.3 集合运算求交集求并集求差集 2.4 Set 相关命令总结 三、Set 类型编码方式四、Set 使用场景 一、Set 类型介绍 Set(集合)是 Redis 数据库中的一种数据类型…...
可变参数JAVA
public class Main {public static void main(String[] args) {//方法形参的个数是可以变化的//格式:属性类型...名字System.out.println(getSum(1,2,3,4,5,6,7,8));}//通过键值对对象来遍历;public static int getSum(int a,int...args){//可变参数;int…...
Zabbix监控平台部署流程
Zabbix WEB、Zabbix Server、Zabbix Database放在一台服务器;(192.168.10.12)Zabbix Agent部署在被监控服务器上 (192.168.10.11)Zabbix Porxy 单独部署在一台服务器上(被监控服务器少于500台可以不部署&am…...
重磅!文晔以38亿美元收购富昌电子 | 百能云芯
文晔微电子股份有限公司(文晔科技)于9月14日正式宣布已完成对富昌电子公司(Future Electronics Inc.)100%股权的收购,该交易以全现金方式完成,总交易价值高达38亿美元。 文晔科技的董事长兼首席执行官郑家强…...
Multimodel Image synthesis and editing:The generative AI Era
1.introduction 基于GAN和扩散模型,通过融入多模态引导来调节生成过程,从不同的多模态信号中合成图像;是为多模态图像合成和编辑使用预训练模型,通过在GAN潜在空间中进行反演,应用引导函数,或调整扩散模型…...
Linux——(第十章)进程管理
目录 一、概述 二、常用指令 1.ps查看当前系统进程状态 2.kill 终止进程 3.pstree 查看进程树 4.top 实时监控系统进程状态 5.netstat 监控网络状态 一、概述 (1)进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体&#…...
【操作系统】聊聊协程为什么可以支撑高并发服务
在实际的业务开发中,比如针对一个业务流程,调用三方,然后存储数据,从oss上获取数据。其实都是进行的同步调用,说白了就是A完成之后,B在继续完成。如果整个过程中A、B、C 分别耗时100、300、200毫秒。那么整…...
算法leetcode|80. 删除有序数组中的重复项 II(rust重拳出击)
文章目录 80. 删除有序数组中的重复项 II:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 80. 删除有序数组中的重复项 II: …...
Vite 完整版详解
1. 打包构建: Vite 使用 Rollup 作为默认的构建工具。通过运行 npm run build 命令,Vite 会将应用程序的源代码打包成一个或多个优化的静态文件,以便在生产环境中进行部署。Vite 的构建过程会根据需要进行代码拆分、压缩和优化,以…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
