访问方法(反射)
文章目录
- 前言
- 一、访问成员方法的方法
- 二、Method类
- 1.常用方法
- 2.实操展示
- 总结
前言
为了实现在某类中随时可以调用其他类的方法,java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法,利用Methoc对象可以操纵相应的方法。
一、访问成员方法的方法
Method类型的对象是指以成员方法为对象的变量。在我们获取成员方法时,根据需要指定Method类型对象是否为数组。
方法 | 功能描述 |
getMethods() | 获得该类的所有公有的成员方法(返回值类型为数组) |
getMethod(String name,Class<?>...parameterTypes) | 获取指定的该类中的公开的成员方法(指定的方法由name字符串决定) |
getDeclaredMethods() | 获取该类的所有成员方法(返回值类型为数组) |
getDeclaredMethod(String name,Class<?>...parameterTypes) | 获取指定的该类中的成员方法(指定的方法由name字符串决定) |
实操展示:
原调用方法的类 :
public class Demo {public int add(int a,int b){System.out.println(a+"+"+b+"="+(a+b));return a+b;}private int minus(int a,int b){System.out.println(a+"-"+b+"="+(a-b));return a-b;}
}
调用该方法的类:
import java.lang.reflect.*;
public class See{Demo demo = new Demo();Class class1=demo.getClass();Method method[] =class1.getDeclaredMethods();//获取demo类中所有的方法,返回形式为method类数组
}
以上就是使用获取成员方法的方法,获取某类的成员方法的步骤了。先实例化该目标类,然后再获取该类的Class对象,最后使用上述表格中的方法即可。目的是在运行过程中,动态地获取和调整类的方法参数。
二、Method类
1.常用方法
方法 | 功能描述 |
getName() | 获得该方法的名称 |
getParameterTypes() | 按照声明顺序以Class数组的形式获取该方法的各个参数的类型 |
getReturnType() | 以Class对象的形式获得该方法的返回值的类型 |
getExceptionTypes() | 以Class数组的形式获取该方法可能抛出的异常 |
invoke(Object obj,Object...args) | 利用指定参数args执行指定对象obj中的该方法,返回值为Object型 |
isVarArgs() | 查看该构造方法是否允许带有可变数量的参数,如果允许返回true,否则返回false |
getModifiers() | 获得可以解析出该方法所采用修饰符的整数 |
setAccessible() | 用于设置反射对象的可访问性,若方法的权限修饰词为private私有,可设置为true来修改该权限,然后可以获取该方法。 |
2.实操展示
实例:创建一个Demo类,在该类中创建多个不同的方法;创建See类,通过使用上述的方法获取到该类的所有方法的所有信息;创建Use类,通过使用上述方法和invoke()方法来调用,调参方法并且进行使用。
Demo类:
public class Demo {//add()方法public int add(int a,int b){System.out.println(a+"+"+b+"="+(a+b));return a+b;}//minus方法private int minus(int a,int b){System.out.println(a+"-"+b+"="+(a-b));return a-b;}//insert方法public String insert(String str1,String str2){char char1[] = str1.toCharArray();char char2[] = str2.toCharArray();StringBuilder end = new StringBuilder();for(int i=0;i<=(char1.length+char2.length);i++){if (i<char1.length) {end.append(char1[i]);}if(i<char2.length){end.append(char2[i]);}}System.out.println(str1+"和"+str2+"插空排序的结果为:"+end);return end.toString();}//nul方法public void nul(String...strings){StringBuilder result = new StringBuilder();for(int i=0;i<strings.length;i++){result.append(strings[i]); }String string =result.toString();System.out.println("连接的字符串为:"+string);}//综上四个方法
}
See类:
import java.lang.reflect.*;
public class See{public static void main(String[] args) {Demo demo = new Demo();Class class1=demo.getClass();Method method[] =class1.getDeclaredMethods();try{ for(int i=0;i<method.length;i++){//成员方法的名称System.out.println("该成员方法的名称:"+method[i].getName());//成员方法的引用参数System.out.println("该成员方法的引用参数为:");Class parameterTypes[] = method[i].getParameterTypes();for(Class c:parameterTypes){System.out.println(c);}//成员方法的返回类型System.out.println("成员方法的返回变量类型:"+method[i].getReturnType());//成员方法的权限修饰符System.out.println("成员变量的修饰符权限:"+Modifier.toString(method[i].getModifiers()));//成员方法可能报错的异常System.out.println("成员方法可能报错的异常:");Class class2[] = method[i].getExceptionTypes();for(Class c1:class2){System.out.println(c1);}//查看该构造方法是否允许带有可变数量的参数boolean b=method[i].isVarArgs();System.out.println("查看该构造方法是否允许带有可变数量的参数:"+b);System.out.println("------------------------------");}} catch (Exception e) {e.printStackTrace();}}
}
运行结果:
如图所示,See类中使用了上述表格中的方法,显示了Demo类中有关各个方法的相关信息,方法名称、引用参数、返回变量、权限修饰符、异常报错等等。
Use类:
import java.lang.reflect.*;
public class Use {public static void main(String[] args) {Demo demo = new Demo();Class class1 = demo.getClass();Method method[] = class1.getDeclaredMethods();for(int i=0;i<method.length;i++){try {if(method[i].getName().equals("add")){System.out.println("调用了Demo类的add()方法");method[i].invoke(demo, 100,150);}else if(method[i].getName().equals("minus")){System.out.println("调用了Demo类的minus()方法");method[i].invoke(demo, 100,350);}else if(method[i].getName().equals("insert")) {System.out.println("调用了Demo类的insert()方法");method[i].invoke(demo, "aceg","BDFH");}else if(method[i].getName().equals("nul")){System.out.println("调用了Demo类的nul()方法");method[i].invoke(demo, new Object[]{new String[]{"你好", ",", "世界", "!"}});}System.out.println("-------------------------------------");} catch (Exception e) {System.out.println("try-catch捕捉到异常,使用setAccessible()方法更改成员变量权限");method[i].setAccessible(true);try {System.out.println("修改权限后,调用了Demo类的minus()方法");method[i].invoke(demo,100,350);System.out.println("-------------------------------------");} catch (Exception e2) {e2.printStackTrace();} }}}
}
运行结果:
如图所示,Use类通过equals方法判断method数组中各个对应的方法,然后使用invoke()方法,输入被调用的类的实例化对象,调整方法引用参数,运行方法。有了异常后更改方法的权限,运行catch语句代码。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了访问成员方法的使用,而Method类提供了大量能使我们便捷地实时处理数据的方法,该类处于java.lang.reflect包下,指正和补充的内容欢迎在评论区中留言。
相关文章:

访问方法(反射)
文章目录 前言一、访问成员方法的方法二、Method类 1.常用方法2.实操展示总结 前言 为了实现在某类中随时可以调用其他类的方法,java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法,利用Methoc对象可以操纵相应的方法…...
探索Excel的隐藏功能:如何求和以zzz开头的列
哈喽,大家好,我是木头左! 步骤一:定位"zzz"开头的列 需要找到所有以"zzz"开头的列。在Excel中,你可以通过以下几种方法来实现: 手动查找:滚动查看列标题,找到…...
git:切换到指定的commit
背景 今天合并人家代码的时候,报冲突了,然后解决完冲突以后,发现有个冲突干错了,但是都已经commit了,所以我就想那就回到这次merge之前的我的分支的commit 解决过程 取消合并 我先查了能否直接取消合并,…...
js之事件监听以及相关案例
这里写目录标题 一级目录二级目录三级目录 Web APIs02一、事件监听1.定义2.调用语法3.事件监听三要素4.事件监听版本 二、事件类型随机点名之事件监听版本案例要求大致思路先获取dom对象理解程序运行 完整代码 一级目录 二级目录 三级目录 Web APIs02 一、事件监听 1.定义…...
pip 安装出现 ERROR: Command errored out with exit status 1: 问题解决
使用pip 安装第三方库,前面在升级pip(使用python.exe -m pip install --upgrade pip)也出现如下错误: ERROR: Command errored out with exit status 1: command: d:\python_3_7_6\python.exe C:\Users\xxxXXXXoooOOOO\AppData…...

图的遍历介绍
概念 特点 无论是进行哪种遍历,均需要通过设置辅助数组标记顶点是否被访问来避免重复访问!!!! 类型 深度优先遍历 可以实现一次遍历访问一个连通图中的所有顶点,只要连通就能继续向下访问。 因此&#x…...

实验二、网络属性设置《计算机网络》
精神状态 be like:边写边崩溃,越写越得劲儿。 目录 一、实验目的: 二、实验内容 三、实验步骤: 四、实验小结 一、实验目的: 掌握 IP 地址、子网掩码等网络属性的设置。 二、实验内容 预备知识: 1、…...

【Python数据魔术】:揭秘类型奥秘,赋能代码创造
文章目录 🚀一.运算符🌈1. 算术运算符🌈2. 身份运算符🌈3. 成员运算符⭐4. 增量运算符⭐5. 比较运算符⭐6. 逻辑运算符 🚀二.可变与不可变🚀三.字符串转义🚀四.编码与解码💥1. 基础使…...
Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds+
Android Glide loading Bitmap from RESOURCE_DISK_CACHE slow,cost time≈2 seconds 加载一张宽高约100px多些的小图,是一张相当小的正常图片,loading Bitmap from RESOURCE_DISK_CACHE竟然耗时达到惊人的3秒左右!(打开Glide调试…...

微调技术:人工智能领域的神奇钥匙
在人工智能的浪潮中,深度学习技术凭借其强大的数据处理和学习能力,已成为推动科技进步的重要引擎。然而,深度学习模型的训练往往需要大量的数据和计算资源,这在某些特定场景下成为了限制其发展的瓶颈。为了解决这个问题࿰…...

MyBatis 参数上的处理的细节内容
1. MyBatis 参数上的处理的细节内容 文章目录 1. MyBatis 参数上的处理的细节内容2. MyBatis 参数上的处理3. 准备工作4. 单个(一个)参数4.1 单个(一个)简单类型作为参数4.2 单个(一个) Map集合 作为参数4.3 单个(一个) 实体类POJO作为参数 5. 多个参数5.1 Param注解(命名参数)…...

水帘降温水温
不同环境下的水帘啊,使用水温是不一样的,夏天使用水疗的水有两种,一个是常温的循环水,20~26左右,另外一个呢,就是深井水,重点是啥呢?就是无论我们用哪一种,能够把温度降到…...

kafka如何保证消息不丢失
Kafka发送消息是异步发送的,所以我们不知道消息是否发送成功,所以会可能造成消息丢失。而且Kafka架构是由生产者-服务器端-消费者三种组成部分构成的。要保证消息不丢失,那么主要有三种解决方法。 生产者(producer)端处理 生产者默认发送消息…...

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8)
流媒体学习之路(WebRTC)——音频NackTracker优化思路(8) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实…...

Java基础面试重点-2
21. JVM是如何处理异常(大概流程)? 如果发生异常,方法会创建一个异常对象(包括:异常名称、异常描述以及异常发生时应用程序的状态),并转交给JVM。创建异常对象,并转交给…...
【活动文章】通用大模型VS垂直大模型,你更青睐哪一方
垂直大模型和通用大模型各有其特定的应用场景和优势。垂直大模型专注于特定领域,提供深度的专业知识和技能,而通用大模型则具备广泛的适用性和强大的泛化能力。以下是一些垂直大模型和通用大模型的例子: 垂直大模型 BERT-Financial…...
记录一个Qt调用插件的问题
问题背景 使用Qt主程序插件的方式开发,即主程序做成一个框,定义好插件接口,然后主程序上通过插件接口与插件进行交互。调试过程中遇到了两个问题,在这里记录一下。 问题1(信号槽定义) 插件与主程序之间&am…...

9.1 Go 接口的定义
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

易于上手的requests
Python中的requests库主要用于发送HTTP请求并获取响应结果。在现代网络编程中,HTTP请求是构建客户端与服务器之间通信的基础。Python作为一种高级编程语言,其丰富的库支持使得它在网络数据处理领域尤为突出。其中,requests库以其简洁、易用的…...

【QT Creator软件】解决中文乱码问题
QT Creator软件解决中文乱码问题 问题描述:Qtcreator安装好后打印中文在控制台输出乱码 在网上也查找了修改编辑器的默认编码为UTF-8,但是仍然没有任何作用,于是有了以下的解决方案 原因剖析:因为项目的编码与控制台的编码不一致…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...