Java反射4

88 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

5、反射获取成员方法并使用【应用】

5.1、Class类获取成员方法对象的方法

  • 方法分类

    方法名说明
    Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
    Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
    Method getMethod(String name, Class<?>... parameterTypes)返回单个公共成员方法对象
    Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回单个成员方法对象
  • 示例代码

    public class Student {
    
        //私有的,无参无返回值
        private void show() {
            System.out.println("私有的show方法,无参无返回值");
        }
    
        //公共的,无参无返回值
        public void function1() {
            System.out.println("function1方法,无参无返回值");
        }
    
        //公共的,有参无返回值
        public void function2(String name) {
            System.out.println("function2方法,有参无返回值,参数为" + name);
        }
    
        //公共的,无参有返回值
        public String function3() {
            System.out.println("function3方法,无参有返回值");
            return "aaa";
        }
    
        //公共的,有参有返回值
        public String function4(String name) {
            System.out.println("function4方法,有参有返回值,参数为" + name);
            return "aaa";
        }
    }
    public class ReflectDemo1 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
            //method1();
            //method2();
            //method3();
            //method4();
            //method5();
        }
    
        private static void method5() throws ClassNotFoundException, NoSuchMethodException {
            //        Method getDeclaredMethod(String name, Class<?>... parameterTypes):
    //                                返回单个成员方法对象
            //1.获取class对象
            Class clazz = Class.forName("com.itheima.myreflect5.Student");
            //2.获取一个成员方法show
            Method method = clazz.getDeclaredMethod("show");
            //3.打印一下
            System.out.println(method);
        }
      
        private static void method4() throws ClassNotFoundException, NoSuchMethodException {
            //1.获取class对象
            Class clazz = Class.forName("com.itheima.myreflect5.Student");
            //2.获取一个有形参的方法function2
            Method method = clazz.getMethod("function2", String.class);
            //3.打印一下
            System.out.println(method);
        }
      
        private static void method3() throws ClassNotFoundException, NoSuchMethodException {
            //        Method getMethod(String name, Class<?>... parameterTypes) :
    //                                返回单个公共成员方法对象
            //1.获取class对象
            Class clazz = Class.forName("com.itheima.myreflect5.Student");
            //2.获取成员方法function1
            Method method1 = clazz.getMethod("function1");
            //3.打印一下
            System.out.println(method1);
        }
      
        private static void method2() throws ClassNotFoundException {
            //        Method[] getDeclaredMethods():
    //                                返回所有成员方法对象的数组,不包括继承的
            //1.获取class对象
            Class clazz = Class.forName("com.itheima.myreflect5.Student");
      
            //2.获取Method对象
            Method[] methods = clazz.getDeclaredMethods();
            //3.遍历一下数组
            for (Method method : methods) {
                System.out.println(method);
            }
        }
      
        private static void method1() throws ClassNotFoundException {
            //        Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
            //1.获取class对象
            Class clazz = Class.forName("com.itheima.myreflect5.Student");
            //2.获取成员方法对象
            Method[] methods = clazz.getMethods();
            //3.遍历
            for (Method method : methods) {
                System.out.println(method);
            }
        }
    }
    

5.2、Method类用于执行方法的方法

  • 方法介绍

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

    参数一: 用obj对象调用该方法

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

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

  • 示例代码

    public class ReflectDemo2 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
    //        Object invoke(Object obj, Object... args):运行方法
    //        参数一:用obj对象调用该方法
    //        参数二:调用方法的传递的参数(如果没有就不写)
    //        返回值:方法的返回值(如果没有就不写)
    
            //1.获取class对象
            Class clazz = Class.forName("com.itheima.myreflect5.Student");
            //2.获取里面的Method对象  function4
            Method method = clazz.getMethod("function4", String.class);
            //3.运行function4方法就可以了
            //3.1创建一个Student对象,当做方法的调用者
            Student student = (Student) clazz.newInstance();
            //3.2运行方法
            Object result = method.invoke(student, "zhangsan");
            //4.打印一下返回值
            System.out.println(result);
        }
    }