访问方法(反射)

news2024/11/26 17:35:19

文章目录

  • 前言
  • 一、访问成员方法的方法
  • 二、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包下,指正和补充的内容欢迎在评论区中留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效处理风电时序数据,明阳集团的 TDengine 3.0 应用实录

作为全国 500 强企业&#xff0c;明阳集团在风电行业拥有领先实力。目前全球超过 800 个项目采用明阳各种型号风电机组&#xff0c;安装数量超过 15000 台。每台风电机组配备数百至上千个监测点&#xff0c;生成的时序数据每秒一条&#xff0c;每天产生亿级以上的数据量。这些数…

Android RTSP/RTMP多路播放时动态切换输出View类型(SurfaceView和TextureView 动态切换)

SurfaceView和TextureView的区别和优缺点等, 相关的资料很多. 从Android低延时播放器实现角度来看, 总结了下主要区别有: 1. MediaCodec输出到SurfaceView延时一般比到TextureView更低. 2. MediaCodec用SurfaceView比TextureView占用的资源一般更少些(CPU和内存都小一些, 不过还…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时&#xff0c;发生第一次捕获&#xff0c;计数器CNT 的值会被锁存到捕获寄存器CCR中&#xff0c;而且还会进入捕获中断&#xff0c;在中断服务程序中记录一次捕获&#xff08;可以用一个标志变量来记录&#…

Spring Cloud Netflix 之 Ribbon

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、负载均衡1.1、服务端负载均衡1.2、客户端负载均衡 2、Ribbon实现服务…

uni-im:云端一体、全平台、免费开源的即时通讯系统解析

一、引言 随着移动互联网的迅猛发展&#xff0c;即时通讯&#xff08;IM&#xff09;系统已成为人们日常沟通不可或缺的一部分。然而&#xff0c;开发一个稳定、高效、跨平台的IM系统并非易事。为了降低开发成本、提高开发效率&#xff0c;越来越多的开发者开始寻找成熟的开源…

LIN 入门(1)

1、概述 LIN 是什么 LIN 是 Local Interconnect Network 的缩写&#xff0c;是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter / Serial Communication Interface&#xff0c;通用异步收发器/串行通信接口)的低成本串行通信协议。可用于汽车、家电、办 公设备等…

图解Mamba——从流体力学的角度理解Mamba

1.Transformer的问题 上面是Transformer的网络结构。对于一句话的每个单词&#xff0c;都需要跟所有单词算注意力机制。因此注意力机制的计算复杂度为 O ( n 2 ) O(n^2) O(n2)&#xff0c;其中 n n n为句子的长度&#xff0c;即单词(符号)的个数。如下图所示。 所以这也是现在…

C++中的结构体——结构体中const的使用场景

作用&#xff1a;用const来防止误操作 示例 运行结果

进阶篇02——索引

概述 结构 B树索引 在这里推荐一个可以将个各种数据结构可视化的网站&#xff1a;数据结构可视化 哈希索引 相关的一个面试题 分类 聚集索引和二级索引&#xff08;非聚集索引&#xff09; 思考题&#xff1a;索引思考题 创建索引语法 如果一个索引关联多个字段&#xff…

Android native层的线程分析(C++),以及堆栈打印调试

文章目录 Android native层的线程分析(C)&#xff0c;多线程实现1.native线程的创建第一部分&#xff1a;android_thread模块第二部分&#xff1a;linux_thread模块 2.测试linux_thread模块3.Android native的Thread类3.1源码分析 4.native层堆栈调试方法 Android native层的线…

[13] CUDA_Opencv联合编译过程

CUDA_Opencv联合编译过程 详细编译过程可见我之前的文章&#xff1a;Win10下OpencvCUDA联合编译详细教程&#xff08;版本455、460、470,亲测可用&#xff01;&#xff01;&#xff01;&#xff09;本文给出Windows\linux下的opencvcuda的编译总结&#xff0c;摘自 <基于GP…

【SSM】医疗健康平台-项目开发准备

知识目标 了解架构&#xff0c;能够说出常用的架构及其优缺点 熟悉项目的技术栈&#xff0c;能够说出每个技术栈的用途 了解项目的功能结构&#xff0c;能够说出医疗健康项目的功能组成 掌握医疗健康项目的环境搭建&#xff0c;能够根据系统模块的划分搭建医疗健康项目中的父…

Java基础面试重点-2

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

推荐系统三十六式学习笔记:原理篇.近邻推荐09|协同过滤中的相似度计算方法有哪些?

目录 相似度的本质相似度的计算方法&#xff1a;1、欧式距离2、余弦相似度3、皮尔逊相关度4 、杰卡德&#xff08;Jaccard&#xff09;相似度 总结 相似度的本质 推荐系统中&#xff0c;推荐算法分为两个门派&#xff0c;一个是机器学习派&#xff0c;一个是相似度门派。机器学…

pytorch版本与torchvision版本不匹配问题处理

pytorch版本与torchvision版本不匹配问题处理 问题问题复现解决方法两点注意内容其一&#xff1a;pytorch版本与torchvision版本对应关系其二&#xff1a;CPU版本或GPU版本问题 问题 在新环境中&#xff0c;利用yolov8训练模型的时候报错&#xff0c;错误内容如下&#xff1a;…

探囊取物之渐变背景登录页面(基于ElementUI)

低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/preview/lxbupnc9dg5q 演练页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/practice/lxbupnc9dg5q

ansible-Role角色批量按照node_export节点,并追加信息到Prometheus文件中

文章目录 剧本功能 inventory.yaml文件定义deploy.yaml角色定义node_exporter_lock角色定义任务角色main.yamlnode_exporter_tasks.yml角色触发任务notifyextra_tasks.yml角色prometheus_node_config.j2模板文件 执行命令查看变量 剧本功能 功能1&#xff1a; 批量执行node_ex…

【电子通识】焊接常见的不良有哪些?

在焊接完成后的调试阶段&#xff0c;有时总会发生一些奇怪的异常。也许是因为在焊接过程中出现了一些莫名其妙的焊接缺陷&#xff0c; 这些焊接缺陷产生的原因各不相同。 在实际的SMT贴片加工或插件焊接中&#xff0c;我们一般会采取一些方法来避免这些焊接不良的现象。那么常见…

PyCharm2018图文安装教程、附录软件下载

软件简介 PyCharm 2018是一款IDE集成开发环境&#xff0c;主要功能包括代码调试、语法高亮、智能提示、单元测试、版本控制等&#xff0c;支持Python 3.7&#xff0c;改进search everywhere功能等&#xff0c;可以让用户快速的开发程序。 软件下载 复制链接浏览器打开 https…

HTML静态网页成品作业(HTML+CSS)—— 电影泰坦尼克号介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…