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

学习反射5(获取成员方法)

目录

前言

成员方法

Class类中用于获取成员方法的方法

实例【获取全部方法或指定方法】

获取成员方法的参数个数和参数类型

获取成员方法的抛出的异常

获取成员方法的方法名

Method类中用于调用的方法 


前言

上一篇博客介绍了 获取成员变量 CSDN  本篇博客介绍如何 获取成员方法以及成员方法中的参数等

成员方法

成员方法也和成员变量一样 ,每一个方法都封装成Method 类 对象 

Class类中用于获取成员方法的方法

Method[]getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[]getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>...parameterypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>.. parameterrypes)返回单个成员方法对象

实例【获取全部方法或指定方法】

现在有一个 Student 类 在基本的方法之前 还新增了 方法 :sleep() 和 eat() 方法

 public void sleep(){
        System.out.println("我爱睡觉");
    }
    private void study(){
        System.out.println("我爱学习");
    }
    private void study(String thing){
        System.out.println("我爱学习"+thing);
    }
  • 获取类中的所有公共方法 包括继承的父类的公共方法

步骤

1 创建 Class 类 对象

2 调用Class 类下的 getMethods()或 getDeclaredMethods()方法

 // 创建 Class 类对象 
        Class<?> aClass = Class.forName("fs.exerise02.Student");
        // 获取Student 类中的所有的方法 包括 继承的 父类的公共方法
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }

运行结果

  • 获取 类中 所有方法 

需要修改的代码如下

   Method[] methods = aClass.getDeclaredMethods();

运行结果

发现

打印的是子类的所有方法,无法获得 父类的所有方法

总结

1 加了 Declared 可以获得 目标类中的所有权限修饰的方法 或指定方法,如果不加只能获得公共的方法

2 加了 Declared 无法获得 继承的父类中的所有方法 ,但是 不加可以获得继承父类的所有公共方法

获取指定方法

步骤

1 创建 Class 类 对象

2 调用Class 类下的 getMethod()或 getDeclaredMethod()​​​​​​​方法

要求 : 获取 带参数的study  方法

 Class<?> aClass = Class.forName("fs.exerise02.Student");
        // 获取Student 类中的指定的方法
        Method method = aClass.getMethod("study", String.class);
        System.out.println(method);

运行结果

发现报错了,原因是 study 方法是被 private  修饰的,无法直接获得。需要使用getDeclaredMethod()​​​​​​​方法

 // 获取Student 类中的指定的方法 
        Method method = aClass.getDeclaredMethod("study", String.class);

运行结果

获取成员方法的参数个数和参数类型

        // 创建 Class 类对象
        Class<?> aClass = Class.forName("fs.exerise02.Student");
        // 获取Student 类中的指定的方法
        Method method = aClass.getDeclaredMethod("study", String.class);
        // 获取方法的参数个数和参数类型
        int parameterCount = method.getParameterCount();
        System.out.println(parameterCount);
        Class<?>[] parameterTypes = method.getParameterTypes();
        for (Class<?> parameterType : parameterTypes) {
            System.out.println(parameterType);
        }

获取成员方法的抛出的异常

我现在向  带参的study 方法添加几个异常

    private void study(String thing) throws NullPointerException, ClassNotFoundException{
        System.out.println("我爱学习"+thing);
    }

Test 测试类中 代码如下

      // 创建 Class 类对象
        Class<?> aClass = Class.forName("fs.exerise02.Student");
        // 获取Student 类中的指定的方法 抛出的异常
        Method method = aClass.getDeclaredMethod("study", String.class);
        Class<?>[] exceptionTypes = method.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType.getName());
        }

运行结果

获取成员方法的方法名

  • 调用 getName()方法 获得 对应的方法名

Method类中用于调用的方法 

Object invoke(Object obj, Object...args)运行方法

注意

参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)

返回值:方法的返回值(如果没有就不写)

实例

调用 带参的study 方法

  // 创建 Class 类对象
        Class<?> aClass = Class.forName("fs.exerise02.Student");
        // 获取Student 类中的指定的方法 抛出的异常
        Method method = aClass.getDeclaredMethod("study", String.class);
        method.setAccessible(true);
       // Student 对象
       Student student = (Student) aClass.newInstance();
       method.invoke(student, "java");

运行结果

发现

为什么调用 setAccessible(true) 方法?

该方法被private 权限修饰符修饰 ,无法直接 调用

invoke()方法的第一个参数 目标类的对象,第二参数 是需要传递的可变参数。可以是一个或多个。


http://www.kler.cn/a/488350.html

相关文章:

  • vue 导出excel接口请求和axios返回值blob类型处理
  • 百度Android面试题及参考答案 (下)
  • 手机的ip地址是根据电话卡归属地定吗
  • 深入讲解 Docker 及实践
  • 【PPTist】公式编辑、插入音视频、添加动画
  • 学习记录:C/C++ 中的续行符
  • 中学综合素质笔记3
  • 创建基本的 Electron 应用项目的详细步骤
  • 学习及笔记
  • 动力节点crm项目业务分析笔记
  • 性能测试05|JMeter:分布式、报告、并发数计算、性能监控
  • WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)
  • 飞书机器人告警实现
  • U盘加密软件哪个好用?免安装、安全、防复制
  • 在 Go 应用中 如何像 FastAPI 一样优雅地构建控制器
  • 【DES加密】
  • el-date-picker日期时间选择器的选择时间限制到分钟级别
  • uniapp页面高度设置(铺满可视区域、顶部状态栏高度、底部导航栏高度)
  • 51单片机——串口通信(重点)
  • 深入解析 Python 2 与 Python 3 的差异与演进
  • 【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!
  • [研发效率]什么是软件工程生产力
  • 【Go】:图片上添加水印的全面指南——从基础到高级特性
  • 【Linux】gawk编辑器
  • Python Matplotlib 教程-Matplotlib 如何绘制常见图表
  • 信息科技伦理与道德3:智能决策