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 的构建过程会根据需要进行代码拆分、压缩和优化,以…...
Psins实战:从零解析SINS/GPS松组合导航中的Kalman滤波器初始化与调参
1. 初识SINS/GPS松组合导航与Kalman滤波 刚接触导航算法的朋友可能会被"SINS/GPS松组合"这个术语吓到,其实拆开看很简单。SINS(捷联惯性导航系统)就像是个不知疲倦的计步器,通过IMU(惯性测量单元)…...
掌握MEAN.JS模块化开发:5个核心模块实战指南与最佳实践
掌握MEAN.JS模块化开发:5个核心模块实战指南与最佳实践 【免费下载链接】mean MEAN.JS - Full-Stack JavaScript Using MongoDB, Express, AngularJS, and Node.js - 项目地址: https://gitcode.com/gh_mirrors/mea/mean MEAN.JS作为基于MongoDB、Express、…...
别再死记硬背时序了!用Arduino+DS18B20,5分钟搞定温度监测(附完整代码)
用ArduinoDS18B20快速搭建温度监测系统 在创客和物联网项目中,温度监测是最基础也最常用的功能之一。传统单片机教程往往要求学习者从底层时序开始啃起,这对于初学者来说无异于一道高墙。而今天我要分享的方法,将让你在5分钟内完成从硬件连接…...
命名实体识别工具:从技术突破到业务价值重构
命名实体识别工具:从技术突破到业务价值重构 【免费下载链接】W2NER 项目地址: https://gitcode.com/gh_mirrors/w2/W2NER 1 解锁NER效率新范式 传统NER为何在长文本中频频失效? 当面对医疗病例中"高血压引发的左心室肥厚导致劳力性呼吸困…...
如何在A100显卡上快速部署Wan2.1图生视频API(含FastAPI配置详解)
高性能显卡实战:A100部署Wan2.1图生视频API全流程解析 当NVIDIA A100显卡遇上Wan2.1图生视频模型,会碰撞出怎样的创意火花?作为当前最先进的生成式AI视频工具之一,Wan2.1凭借其14B参数的强大模型,正在改变内容创作的工…...
I2C协议详解:从基础原理到工程实践
1. I2C协议基础与核心设计思想I2C(Inter-Integrated Circuit)总线是Philips公司(现NXP)在1980年代开发的一种同步、半双工串行通信协议。作为嵌入式系统中最常用的总线之一,I2C以其简洁的两线制(SDA数据线S…...
PredRNN++:从单元到系统,逐层拆解与实战解析
1. PredRNN核心单元拆解 PredRNN作为视频预测领域的里程碑模型,其核心创新在于Causal LSTM和GHU两大单元的设计。我们先从代码层面看看它们如何运作。 1.1 Causal LSTM的三明治结构 打开CausalLSTMCell.py文件,你会发现这个单元像三明治一样分为三层&…...
2026论文写作工具红黑榜:AI论文软件怎么选?实测才敢推!
红榜优先选千笔AI、ThouPen、豆包,适配国内学术规范,提升写作效率与合规性;黑榜需避开低质免费工具、无真实引用平台、过度依赖全文生成的工具。选择时建议按需求匹配度 - 数据可信度 - 成本承受力三维模型综合评估。一、红榜:10 …...
解锁Blender操作可视化:6大核心价值与7个实战技巧提升300%教程质量
解锁Blender操作可视化:6大核心价值与7个实战技巧提升300%教程质量 【免费下载链接】Screencast-Keys Blender Add-on: Screencast Keys 项目地址: https://gitcode.com/gh_mirrors/sc/Screencast-Keys 在数字创作领域,操作可视化是连接创作者与观…...
Qwen3-4B Instruct-2507实操手册:自定义system prompt提升专业领域表现
Qwen3-4B Instruct-2507实操手册:自定义system prompt提升专业领域表现 1. 引言:为什么需要自定义system prompt? 你可能已经体验过Qwen3-4B Instruct-2507的流畅对话了。它写代码、做翻译、回答一般问题都挺在行。但有时候,你可…...
