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

发布于:2025-02-10 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

前言

成员方法

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()方法的第一个参数 目标类的对象,第二参数 是需要传递的可变参数。可以是一个或多个。


网站公告

今日签到

点亮在社区的每一天
去签到