Java反射之Method对象详解

 2022-08-28
原文地址:https://blog.51cto.com/u_11440114/5100131

使用Java反射,可以在运行时检查一个方法的信息以及在运行期调用这个方法,通过使用java.lang.reflect.Method类就可以实现上述功能。

获取Method对象

可以通过Class对象获取Method对象,如下例:

    Class aClass = ...//获取Class对象
    Method[] methods = aClass.getMethods();

返回的Method对象数组包含了指定类中声明为公有的(public)的所有变量集合。
如果你知道你要调用方法的具体参数类型,你就可以直接通过参数类型来获取指定的方法,下面这个例子中返回方法对象名称是“doSomething”,他的方法参数是String类型:

    Class  aClass = ...//获取Class对象
    Method method = aClass.getMethod("doSomething", new Class[]{String.class});

如果根据给定的方法名称以及参数类型无法匹配到相应的方法,则会抛出NoSuchMethodException。
如果你想要获取的方法没有参数,那么在调用getMethod()方法时第二个参数传入null即可,就像这样:

    Class  aClass = ...//获取Class对象
    Method method = aClass.getMethod("doSomething", null);

方法参数以及返回类型

你可以获取指定方法的方法参数是哪些:

    Method method = ... //获取Class对象
    Class[] parameterTypes = method.getParameterTypes();

你可以获取指定方法的返回类型:

    Method method = ... //获取Class对象
    Class returnType = method.getReturnType();

method.getDeclaringClass()

返回表示类或接口的Class对象,该类或接口声明了由此对象表示的可执行文件

method.isDefault()

如果此方法是默认方法,则返回true
否则返回false。

默认方法是public 非abstract的实例方法,即具有方法的非static方法,在接口类型中声明

通过Method对象调用方法

你可以通过如下方式来调用一个方法:

    //获取一个方法名为doSomesthing,参数类型为String的方法
    Method method = MyObject.class.getMethod("doSomething", String.class);
    Object returnValue = method.invoke(null, "parameter-value1");

传入的null参数是你要调用方法的对象,如果是一个静态方法调用的话则可以用null代替指定对象作为invoke()的参数,在上面这个例子中,如果doSomething不是静态方法的话,你就要传入有效的MyObject实例而不是null。
Method.invoke(Object target, Object … parameters)方法的第二个参数是一个可变参数列表,但是你必须要传入与你要调用方法的形参一一对应的实参。就像上个例子那样,方法需要String类型的参数,那我们必须要传入一个字符串。