JAVA Method

概述

通过反射可以获取某类的 成员方法 信息,成员方法 对应的类是 Method 类,成员方法 的信息封装在 Method 类对象中

获取 Method 类对象

通过Class类的以下方法:

  • getMethod(String name, Class...<?> parameterTypes) 获得该类某个公有的方法
  • getMethods() 获得该类所有公有的方法
  • getDeclaredMethod(String name, Class...<?> parameterTypes) 获得该类某个方法
  • getDeclaredMethods() 获得该类所有方法

Method 类常用方法

例子: 打印成员方法信息

定义Student4类,方法抛出Exception,无意义,只是为了学习

public class Student4 {

    public void study(String lesson) throws Exception{
        System.out.println("学习 "+lesson);
    }
}

测试类

public class Test4 {
    public static void main(String[] args) {
        try {
            printMethodInfo("reflect.Student4");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    static void printMethodInfo(String className) throws ClassNotFoundException {
        Class cls=Class.forName(className);
        System.out.println("成员方法:");
        Method[] methods=cls.getDeclaredMethods();
        for(Method m:methods){
            System.out.println(m.getName());
            System.out.println("形参类型:");
            // 获取所有参数类型
            Class[] parameterTypes = m.getParameterTypes();
            for (Class p:parameterTypes) {
                System.out.println(" " + p.getSimpleName());
            }
            System.out.println("拋出异常:");
            // 获取所有可能拋出的异常类型
            Class[] exceptionTypes = m.getExceptionTypes();
            for (Class e:exceptionTypes) {
                System.out.println(" " + e.getSimpleName());
            }
        }
    }

}

动态创建对象,并调用方法

应用场景:

  • 实例化Servlet
  • java框架,如:Mybatis、spring

例子

定义Student4类,方法抛出Exception,无意义,只是为了学习

public class Student4 {

    public void study(String lesson) throws Exception{
        System.out.println("学习 "+lesson);
    }
}

测试类

public class Test41 {
    public static void main(String[] args) {
        try {
            call("reflect.Student4");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    static void call(String className) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException {
        Class cls=Class.forName(className);
        Constructor[] cons=cls.getDeclaredConstructors();
        Object obj=cons[0].newInstance();
        Method[] methods=cls.getDeclaredMethods();
        methods[0].invoke(obj,"《java从入门到上天》");
    }

}

https://www.jianshu.com/p/9be58ee20dee


原文出处:/show_1EF4tKpfgrLr.html