访问方法(反射)

文章目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【需求设计】软件概要设计说明怎么写?概要设计说明书实际项目案例(63页Word直接套用)

软件概要设计说明书书写要点可以归纳为以下几个方面&#xff0c;以确保文档的准确性、完整性和可读性&#xff1a; 引言 目的&#xff1a;介绍编写该文档的目的、主要内容及目标读者。 背景&#xff1a;说明被开发软件的名称、项目提出者、开发者等背景信息。 需求概述&#xf…

【FreeRTOS】创建第一个多任务程序

创建第1个多任务程序 韦东山 Freertos学习 第一个多任务程序创建 1. 目标 创建两个任务&#xff0c;任务A运行Led_Test&#xff0c;任务B运行LCD_Test。 硬件平台&#xff1a;DShanMCU-F103开发板 2. 接口函数 创建任务的API函数 不同操作系统有不同的创建API函数 FreeRTOS&…

全网首发-Docker被封后的代理设置教程

最近上交、科大以及阿里的一些docker镜像&#xff0c;好像都因为不可控力导致无法访问。 所以&#xff0c;之前好多正常的一些镜像的打包都会报错&#xff1a; 比如&#xff1a; #1 [internall load build definition from Dockerfile#1transferring dockerfile:972B done#1 D…

5.2 参照完整性

5.2.1 外键约束 语法格式&#xff1a;constraint < symbol > foreign key ( col_nam1[, col_nam2... ] ) references table_name (col_nam1[, col_nam2...]) [ on delete { restrict | cascade | set null | no action } ] [ on update { restrict | cascade | set nu…

水帘降温水温

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

新版Win11强制开启Bitlocker已实锤,难道真就治不了它了?(含自制工具下载)

网管小贾 / sysadm.cc 满院芳草绿&#xff0c;几树梨花香。 如此大一座院落中&#xff0c;唯范贤一人正自斟自饮悠闲地品着茶。 忽闻得一阵微风拂面&#xff0c;似乎有人在呼喊他…… “哥……哥㖿……原来你在这儿啊……哎哟……” 范贤转过脸去&#xff0c;正想看看来者何…

【虚拟现实】二、主要的AR/VR硬件设备

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 2.1 微软HoloLens 微软HoloLens是一款领先的混合现实设备&#xff0c;结合了AR和VR的元素&#xff0c;允许用户…

计算机科学(学习笔记三)

内容来源&#xff1a;计算机科学 指令和程序 指令&#xff1a;指示计算机要做什么的代码&#xff0c;多条指令共同组成程序。 计算机指令长度 由于早期计算机每个字只有8位&#xff0c;指令只占4位&#xff0c;意味着只能有16个指令&#xff0c;这远远不够。 现代计算机有两…

北交字节联合提出ClassDiffusion: 使用显式类别引导的一致性个性化生成。

在个性化生成领域, 微调可能会引起过拟合导致模型无法生成与提示词一致的结果。针对这个问题&#xff0c;北交&字节联合提出ClassDiffusion&#xff0c;来提升个性化生成的一致性。 通过两个重要观察及理论分析提出了新的观点:一致性的损失是个性化概念语义偏移导致的, 还…

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(2)

1需求分析&#xff1a; 继续制作可交互沙子内容&#xff0c;前面我们已经让角色在指定区域留下痕迹&#xff0c;那么能否让区域移动起来&#xff0c;这样才能逐步满足角色走到哪里都能产生交互痕迹&#xff0c;满足更大的地图。 2.操作实现&#xff1a; 1.首先建立角色能产生…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 输入对话框QInputDialog 文章编号&#xff1a;…

AOSP12隐藏首页搜索框----隐藏google 搜索栏

目录 第一步&#xff1a;修改文件 第二步&#xff1a;修改文件 第三步&#xff1a;重新编译源码&#xff0c;启动模拟器 第四步、运行效果 第一步&#xff1a;修改文件 源码文件路径: packages/apps/Launcher3/res/layout/search_container_workspace.xml&#xff0c;将…

rv1126-rv1109-串口显示路径不变化

串口只有#, 后来看了教程改成如下 但是没有变化,那个路径都只显示rootLonbon# 于是最后改成了这样 因为:

ADS基础教程19 - 电磁仿真(EM)基本概念和实操

EM介绍 一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍 三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip&#xff08;微带线&#xff09;3.添加Substrate4.Momentum仿真 四、总结 一、引言 本章节开始介绍EM的基本概念、内容以及实现具体…

JavaWeb6 Tomcat+postman请求、响应

Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发 部署web项目&#xff0c;对外提供网上信息浏览服务 Tomcat 轻量级web服务器&#xff0c;支持servlet&#xff0c;jsp等少量javaEE规范 也被称为web容器&#xff0c;servlet容器 Springboot有内置Tomcat nginx…

使用AlphaCodium进行代码生成,从提示工程到流程工程

AlphaCodium 的代码生成方法 论文地址&#xff1a;https://arxiv.org/pdf/2401.08500.pdf 源码地址&#xff1a;https://github.com/codium-ai/alphacodium 研究要点包括 **挑战&#xff1a;**现有的自然语言优化方法无法扩展 LLM 的代码生成能力**解决方案&#xff1a;**使…

二刷算法训练营Day29 | 回溯算法(5/6)

目录 详细布置&#xff1a; 1. 491. 非递减子序列 2. 46. 全排列 3. 47. 全排列 II 详细布置&#xff1a; 1. 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序…

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…

一文讲清:生产报工系统的功能、报价以及如何选择

最近这几年&#xff0c;企业越来越注重生产的速度和成本&#xff0c;尤其是“性价比”&#xff0c;生产报工系统已经变成了制造业里不可或缺的一部分。不过&#xff0c;市场上生产报工系统的选择太多&#xff0c;价格也都不一样&#xff0c;这就给很多企业出了个难题&#xff1…

LVS+Keepalived高可用负载均衡群集

目录 一.高可用群集相关概述 1.高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 高可用群集&#xff08;HA&#xff09; 两者比较 2.Keepalived高可用方案 3.Keepalived的体系模块及其作用 4.Keepalived实现原理 二.LVSKeepAlived高可用负载均衡集群的…