java反射获取方法以及调用方法

news2024/12/23 12:10:44

Class类中获取方法:

public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>

public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法  对于Method 的方法仍然需要设置

权限。

public Method[] getMethod(String methodName, Class<T>...parameterTypes);//表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

       parameterTypes:表示获取的方法的参数的Class类型

public Method[] getDeclaredMethod(String methodName, Class<T>...parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法

1、获取某个类中的方法

public static void main(String args[]) throws Exception {
        Class<?> cls = SysUserClient.class;
//        public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>
//        public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
        Method methods[] = cls.getDeclaredMethods();
        for (Method met : methods) {
            String res = "";
            int mod = met.getModifiers();
            //先输出方法名字
            res = res + Modifier.toString(mod) + " " + met.getReturnType().getName() + " " + met.getName() +  "(";
            Class<?> params[] = met.getParameterTypes();
            for (int x = 0; x < params.length; x ++) {
                //拼凑出方法要求的数据类型
                res = res + params[x].getName() + " "  + "args-" + x;
                if (x < params.length - 1) {
                    res = res +",";
                }
            }
            res = res + ") ";
            Class<?> exp[] = met.getExceptionTypes();
            if (exp.length > 0) {
                //获取其支持处理的异常信息
                res = res + "throws ";
            }
            for (int x = 0 ; x < exp.length ; x ++) {
                res = res + exp[x].getName();
                if (x < exp.length - 1) {
                    res = res +",";
                }
            }
            System.out.println(res);
            System.out.println(); //换行
        }
    }

获取结果如图

 2、java反射调用方法

//    不使用反射机制怎么调用对象?
//    public static void main(String[] args) {
//        SysUserDTO dto = new SysUserDTO();
//        dto.setUserName("吴素");
//        dto.setId(9);
//        dto.setAge("20");
//        dto.setUserEmail("nangong@163.com");
//        HopeRequest hopeRequest = new HopeRequest();
//        hopeRequest.setAppId("zkawTest");
//        hopeRequest.setPublicKey(PUBLIC_KEY_STRING);
//        hopeRequest.setType("list");
//        hopeRequest.setData(JSONObject.toJSONString(dto));
//        String pageModelBaseResponse = SysUserClient.invokeApi(hopeRequest);
//        System.out.println(pageModelBaseResponse);
//    }


//通过反射机制调用对象
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        SysUserDTO dto = new SysUserDTO();
        dto.setUserName("吴素");
        dto.setId(9);
        dto.setAge("20");
        dto.setUserEmail("nangong@163.com");
        HopeRequest hopeRequest = new HopeRequest();
        hopeRequest.setAppId("zkawTest");
        hopeRequest.setPublicKey(PUBLIC_KEY_STRING);
        hopeRequest.setType("list");
        hopeRequest.setData(JSONObject.toJSONString(dto));
        Class clazz  =  SysUserClient.class;
        Method method =  clazz.getDeclaredMethod("invokeApi",new Class[]{HopeRequest.class});
        Object invoke = method.invoke(new SysUserClient(), new Object[]{hopeRequest});
        System.out.println(invoke);
    }

反射机制的作用:让代码很具有通用性,可变化的内容都是写到配置文件当中,将来修改配置文件之后,创建的对象不一样,调用的方法也不同了,但是java代码不需要做任何的改动 。

补充:

getMethod(方法名,Object... args)

invoke(Object obj,Object... args)

可变长参数
     Object... args这就是可变长参数
    语法是:类型...(注意:一定是3个点)
    1.可变长参数要求的参数个数是:0~N个
    2.可变长参数只能有一个,并且必须在参数列表的最后一个位置上
    3.可变长数组可以当做一个数组来看待

3、补充一些关于Java反射的知识

Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。

如: Clazz.getName()获取类的完整名字

                  getPackage()获取此类所属的包

                  getSuperclass() 获取父类对应的Class对象

                   getFiled(String name) 获得类的指定成员变量

                   getMethods() 获得类的public类型的方法

                   getMethod(String name, Class[] args) 获取类的指定方法

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

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

相关文章

SQL-计算连续签到天数

1、应用场景 现在有一份用户签到行为数据&#xff0c;记录了用户ID&#xff0c;签到日期。 在业务场景中&#xff0c;通常会要求用户连续签到&#xff0c;如果断签则要重新开始计数。 所以需要基于上述数据&#xff0c;计算筛选出连续签到天数大于n天的用户。 日期用户ID20…

chatgpt赋能python:Python仿真模拟:介绍与应用

Python仿真模拟&#xff1a;介绍与应用 Python是一种流行的编程语言&#xff0c;其与技术仿真的结合越来越受欢迎&#xff0c; 广泛用于各种仿真和模拟应用程序中。在本文中&#xff0c;我们将介绍Python仿真模拟的基本原理&#xff0c;及其在不同领域中的应用和优势。 什么是…

在酒店房间中的数据库索引

如果你经常去酒店&#xff0c;你会看到一块类似下面的标牌&#xff0c;指引你到达房间。这能够帮助你方便快速地找到房间&#xff0c;特别是当酒店拥有许多房间时。 以一个有9层的酒店为例。你的房间号是917。第一步是找到你的房间在哪一层&#xff0c;通常第一个数字表示楼层…

[数据结构习题]链表——单链表重排

[数据结构习题]链表——单链表重排 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——顺序存储 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——链式存储 &#x1f449;[王道数据结构]习题导航&#x1f48e;&#xff1a; p …

DAY02_MySQL高级-约束数据库设计多表查询事务

目录 1 约束1.1 概念1.2 分类1.3 非空约束1.4 唯一约束1.5 主键约束1.6 默认约束1.7 约束练习1.7.1 修改自增序列号 1.8 外键约束1.8.1 概述1.8.2 语法1.8.3 练习 2 数据库设计2.1 数据库设计简介2.2 表关系(一对多)2.3 表关系(多对多)2.4 表关系(一对一)2.5 数据库设计案例 3 …

kubernetes之client-go informer源码分析

一、概念 informer 是 client-go 中的核心工具包&#xff0c;在kubernetes中&#xff0c;各个组件通过HTTP协议跟 API Server 进行通信。如果各组件每次都直接和API Server 进行交互&#xff0c;会给API Server 和ETCD造成非常大的压力。在不依赖任何中间件的情况下&#xff0…

从零开始手写VIO 第3讲 基于优化的 IMU 与视觉信息融合

技巧性u初始值&#xff0c;更新的原因都不知道杂来的 F(x)是复杂的非线性函数&#xff0c;所以没法直接求导0得到最小值。所以展开 两种方法来下降&#xff0c;一种是先找一个方向&#xff0c;在确定一个步长line search。另一种是先确定区域&#xff0c;再找一个点。 J是FX的雅…

docker架构速看(1)-启动

Docker架构速看(1)-启动 ​ Docker是常用的容器管理工具&#xff0c;这篇文章对Docker架构结合源码做简要分析&#xff0c;由于也只使用过很少的命令&#xff0c;所以只分析image和container的相关部分。 源码准备 ​ Docker源码可以在github上找到&#xff0c;当前已更名为…

Vector-常用CAN工具 - VN5000接口以太网包过滤

目录 一、什么是硬件过滤&#xff1f; 1、什么时候应该过滤硬件&#xff1f; 2、需要注意什么&#xff1f; 3、如何过滤VN5000接口上的以太网报文&#xff1f; &#xff08;1&#xff09;Vector Hardware Manager &#xff08;2&#xff09;Vector Hardware Config 一、…

Benewake(北醒) 快速实现 TF03-485 与电脑通信操作说明

目录 一、前言二、工具准备1. USB-RS485 转接板或北醒 TF 系列专用转接板2. TF03-4853. PC&#xff1a;Windows 系统4. 串口助手软件、上位机 WINCC 三、连接方式方案一&#xff1a;USB-RS485 连接电脑与雷达(1) USB-RS485 转接板接口说明(2) TF03-485 引脚定义(3) 连接方式 方…

Go中的并发是困难的

我明白标题可能有些令人困惑&#xff0c;因为一般来说&#xff0c;Go被认为在并发方面有很好的内置支持。然而&#xff0c;我并不认为在Go中编写并发软件是容易的。让我向您展示我是什么意思。 使用全局变量 第一个例子是我们在项目中遇到的问题。直到最近&#xff0c;sarama…

【致敬未来的攻城狮计划】打卡1:rcsa+keil环境搭建

前言 这回参加的是csdn李肯老师的攻城狮计划&#xff0c;简单说就是我白嫖板子&#xff0c;输出学习笔记。 板子是瑞萨的CPK_RA2E1&#xff0c;还有触摸元件&#xff0c;看起来很有意思hh。 环境搭建 一开始决定采取vscode搭建的方式。后期进行到最后一步——cmake build的时…

SQL-计算留存率cohort

目录 1、留存率cohort介绍及其业务价值 2、计算思路 3、实操 3.1、日对日留存cohort 3.2、周对周留存cohort 3.3、月对月留存cohort 1、留存率cohort介绍及其业务价值 留存率cohort也叫做同期群留存分析&#xff0c;将同一时间范围内的用户分为一组&#xff0c;计算这批…

Linux命令(26)之uptime

Linux命令之uptime 1.uptime介绍 linux命令uptime是用来为用户提供系统从开启到当前运行uptime命令时系统已运行的时长信息&#xff0c;除此之外&#xff0c;还提了系统启动时间&#xff0c;当前登录用户&#xff0c;系统平均负载信息。 2.uptime用法 uptime [参数] uptime…

华为OD机试真题(Java),四则运算(100%通过+复盘思路)

一、题目描述 输入一个表达式&#xff08;用字符串表示&#xff09;&#xff0c;求这个表达式的值。 保证字符串中的有效字符包括[‘0’-‘9’],‘’,‘-’, ‘*’,‘/’ ,‘(’&#xff0c; ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。 数据范围&#xff1a;表达…

gitlab记录

1、docker方式部署启动 参考文档&#xff1a; https://blog.csdn.net/weixin_53443677/article/details/125518696 https://blog.csdn.net/weixin_39034012/article/details/119211630 1.1、docker启动gitlab 前期准备 > # 拉镜像 > docker pull gitlab/gitlab-ce:late…

chatgpt赋能python:Python代码30行:提高网站SEO的最佳实践

Python 代码 30 行&#xff1a;提高网站 SEO 的最佳实践 搜索引擎优化&#xff08;SEO&#xff09;是网站成功的重要因素&#xff0c;它可以让网站排名更高并吸引更多的流量。Python 代码可以帮助您实现最佳的 SEO 实践&#xff0c;并提高网站的可见性和排名。下面是一个包含 …

Tugraph的设计和源码初步解析

1. Tugraph Tugraph是一款开源的性能优秀的图数据库&#xff0c;该图数据库使用多版本的BTree作为数据的存储引擎&#xff0c;同时设置了点边数据在这个存储引擎上的布局&#xff08;主要考虑数据的局部性&#xff09;&#xff0c;从而达到高性能查询的目的。本文主要从Tugrap…

ubuntu系统登录密码重置方法

公司搬家&#xff0c;需要更改git服务器地址&#xff0c;发现服务器密码也忘记了&#xff0c;折腾了下&#xff0c;通过如下方法修改成功。 一、重启计算机并进入GRUB菜单&#xff08;如果您的计算机没有显示GRUB菜单&#xff0c;请尝试按住Shift键或Esc键&#xff0c;直到出现…

手机安卓Termux搭建Hexo博客网站,并发布公网访问。

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章&#xff1a;安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…