当前位置: 首页 > news >正文

访问方法(反射)

文章目录

  • 前言
  • 一、访问成员方法的方法
  • 二、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.常用方法

Method类的常用方法
方法功能描述
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.实操展示总结 前言 为了实现在某类中随时可以调用其他类的方法&#xff0c;java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法&#xff0c;利用Methoc对象可以操纵相应的方法…...

探索Excel的隐藏功能:如何求和以zzz开头的列

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 步骤一&#xff1a;定位"zzz"开头的列 需要找到所有以"zzz"开头的列。在Excel中&#xff0c;你可以通过以下几种方法来实现&#xff1a; 手动查找&#xff1a;滚动查看列标题&#xff0c;找到…...

git:切换到指定的commit

背景 今天合并人家代码的时候&#xff0c;报冲突了&#xff0c;然后解决完冲突以后&#xff0c;发现有个冲突干错了&#xff0c;但是都已经commit了&#xff0c;所以我就想那就回到这次merge之前的我的分支的commit 解决过程 取消合并 我先查了能否直接取消合并&#xff0c…...

js之事件监听以及相关案例

这里写目录标题 一级目录二级目录三级目录 Web APIs02一、事件监听1.定义2.调用语法3.事件监听三要素4.事件监听版本 二、事件类型随机点名之事件监听版本案例要求大致思路先获取dom对象理解程序运行 完整代码 一级目录 二级目录 三级目录 Web APIs02 一、事件监听 1.定义…...

pip 安装出现 ERROR: Command errored out with exit status 1: 问题解决

使用pip 安装第三方库&#xff0c;前面在升级pip&#xff08;使用python.exe -m pip install --upgrade pip&#xff09;也出现如下错误&#xff1a; ERROR: Command errored out with exit status 1: command: d:\python_3_7_6\python.exe C:\Users\xxxXXXXoooOOOO\AppData…...

图的遍历介绍

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

实验二、网络属性设置《计算机网络》

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

【Python数据魔术】:揭秘类型奥秘,赋能代码创造

文章目录 &#x1f680;一.运算符&#x1f308;1. 算术运算符&#x1f308;2. 身份运算符&#x1f308;3. 成员运算符⭐4. 增量运算符⭐5. 比较运算符⭐6. 逻辑运算符 &#x1f680;二.可变与不可变&#x1f680;三.字符串转义&#x1f680;四.编码与解码&#x1f4a5;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多些的小图&#xff0c;是一张相当小的正常图片&#xff0c;loading Bitmap from RESOURCE_DISK_CACHE竟然耗时达到惊人的3秒左右&#xff01;&#xff08;打开Glide调试…...

微调技术:人工智能领域的神奇钥匙

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

MyBatis 参数上的处理的细节内容

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

水帘降温水温

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

kafka如何保证消息不丢失

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

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8)

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

Java基础面试重点-2

21. JVM是如何处理异常&#xff08;大概流程&#xff09;&#xff1f; 如果发生异常&#xff0c;方法会创建一个异常对象&#xff08;包括&#xff1a;异常名称、异常描述以及异常发生时应用程序的状态&#xff09;&#xff0c;并转交给JVM。创建异常对象&#xff0c;并转交给…...

【活动文章】通用大模型VS垂直大模型,你更青睐哪一方

垂直大模型和通用大模型各有其特定的应用场景和优势。垂直大模型专注于特定领域&#xff0c;提供深度的专业知识和技能&#xff0c;而通用大模型则具备广泛的适用性和强大的泛化能力。以下是一些垂直大模型和通用大模型的例子&#xff1a; 垂直大模型 BERT-Financial&#xf…...

记录一个Qt调用插件的问题

问题背景 使用Qt主程序插件的方式开发&#xff0c;即主程序做成一个框&#xff0c;定义好插件接口&#xff0c;然后主程序上通过插件接口与插件进行交互。调试过程中遇到了两个问题&#xff0c;在这里记录一下。 问题1&#xff08;信号槽定义&#xff09; 插件与主程序之间&am…...

9.1 Go 接口的定义

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

易于上手的requests

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

【QT Creator软件】解决中文乱码问题

QT Creator软件解决中文乱码问题 问题描述&#xff1a;Qtcreator安装好后打印中文在控制台输出乱码 在网上也查找了修改编辑器的默认编码为UTF-8&#xff0c;但是仍然没有任何作用&#xff0c;于是有了以下的解决方案 原因剖析&#xff1a;因为项目的编码与控制台的编码不一致…...

边缘网关在智能制造工厂中的创新应用及效果-天拓四方

在数字化浪潮席卷之下&#xff0c;智能制造工厂正面临着前所未有的数据挑战与机遇。边缘网关&#xff0c;作为数据处理与传输的关键节点&#xff0c;在提升工厂运营效率、确保数据安全方面发挥着日益重要的作用。本文将通过一个具体案例&#xff0c;详细阐述边缘网关在智能制造…...

Django-filter

准备工作 首先&#xff0c;确保你已经安装了django-filter包。如果没有&#xff0c;请使用以下命令安装&#xff1a; pip install django-filter然后&#xff0c;在你的settings.py文件中添加django_filters到INSTALLED_APPS列表中&#xff1a; INSTALLED_APPS [# ...djang…...

文字悬停效果

文字悬停效果 效果展示 CSS 知识点 CSS 变量使用回顾-webkit-text-stroke 属性的运用与回顾 页面整体结构实现 <ul><li style"--clr: #e6444f"><a href"#" class"text">First</a></li><li style"--cl…...

[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize <?php class X {public $x __FILE__;function __construct($x){$this->x $x; }function __wakeup(){if ($this->x ! __FILE__) {$this->x __FILE__; }}function __destruct(){highlight_file($this->x);//flag is…...

2-1基于matlab的拉普拉斯金字塔图像融合算法

基于matlab的拉普拉斯金字塔图像融合算法&#xff0c;可以使部分图像模糊的图片清楚&#xff0c;也可以使图像增强。程序已调通&#xff0c;可直接运行。 2-1 图像融合 拉普拉斯金字塔图像融合 - 小红书 (xiaohongshu.com)...

Android基础-进程间通信

在Android系统中&#xff0c;跨进程通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是实现不同应用程序或同一应用程序中不同进程间数据共享和交互的关键技术。Android提供了多种IPC机制&#xff0c;每种机制都有其特定的使用场景和优缺点。下面将详细…...

【微信小程序】uni-app 配置网络请求

原因 由于平台的限制&#xff0c;小程序项目中 不支持axios&#xff0c;而且原生的&#xff0c;wx.request()API功能较为简单&#xff0c;不支持拦截器等全局定制的功能。因此&#xff0c;建议在uni-app项目中使用 escook/request-miniprogram 第三方包发起网络数据请求。 步…...

SpringCash

文章目录 简介引入依赖常用注解application.yml使用1. 启动类添加注解使用方法上添加注解 简介 Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能底层可以使用EHCache、Caffeine、Redis实现缓存。 注解一般放在Controller的方法上&#xff0c;CachePut 注解一般有…...

小红书的文案是怎么写的?有啥套路么!

小红书文案是有自己的调性的&#xff0c;为什么别人的笔记轻轻松松就是爆款&#xff0c;而自己写的笔记却没有人看呢&#xff0c;小红书文案写作有啥套路&#xff1f; 接下来伯乐网络传媒给大家讲一讲&#xff0c;小红书文案写作揭秘&#xff1a;抄作业、拆解产品到种草笔记结…...

开放平台接口安全验证

文章目录 开放平台接口安全验证I 加签方式说明1.1 签名生成的通用步骤1.2 生成随机数算法1.3 举例1.4 签名校验工具II Header参数说明III 业务接口返回结构说明开放平台接口安全验证 统一使用sign签名验证,签名规则也会在本文档中,详细说明。请大家认真阅读。 向平台申请密码…...

定制开发网站多少钱/百度推广客户端手机版下载

来源&#xff1a;点击打开链接 纯字符串模拟排版。基本无难度&#xff0c;但是用STRING会出现一点点问题。还是用CHAR更靠谱一些。当然最重要的是读题&#xff0c;第一个向左第二个向右以此类推&#xff0c;所以要添加一个判断的语句来判奇偶行。看测试数据的时候发现了“*”…...

长宁区公司网站建设/成品视频直播软件推荐哪个好用

参数是否必须说明appid是公众号的唯一标识secret是公众号的appsecretcode是填写第一步获取的code参数grant_type是填写为authorization_code前端可以调用这个接口&#xff0c;但是会跨域&#xff0c;所以这个接口一般是由后台进行封装的 你只需要把code传给后台&#xff0c;让后…...

手机wap网站模板/上海发布最新情况

gitee产品配额说明 参考网址: https://gitee.com/help/articles/4283#article-header0 具体内容 类型说明仓库数量创建 1000 个仓库&#xff0c;不限制公私有。仓库容量Git 单仓库容量上限为 500M &#xff0c;SVN 单仓库容量上限为 400M 单文件最大 50M 用户总仓库容量为 5G…...

贵州做网站kuhugz/短视频运营

转自&#xff1a;http://cuijiahua.com/blog/2018/01/dl_3.html 摘要 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition&#xff0c;是一种用于手写体字符识别的非常高效的卷积神经网络。 一、前言 LeNet-5出自论文Gradient-Based Learning Applied …...

济源网站制作/搜索引擎优化的含义

环境 基于centos 6.5 在文本界面 系统目录的字体颜色是 黑底蓝字 严重看不清楚&#xff0c;对此作出修改 使用 vi 编辑 进入 /etc/DIR_COLORS 找到“DIR 01;34 # directory”&#xff0c;将34改为36 数字代表的颜色 在下面会有显示 你可以找到文件的两行注释&#xff1a;…...

东莞网站建设建网站/灰色行业seo

本文作者&#xff1a;薄荷糖微微凉 Destoon B2B网站管理系统是一套完善的B2B&#xff08;电子商务&#xff09;行业门户解决方案。系统基于PHPMySQL开发&#xff0c;采用B/S架构&#xff0c;模板与程序分离&#xff0c;源码开放。模型化的开发思路&#xff0c;可扩展或删除任何…...