(一)通过文档可以了解一下Method类
Method
提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
Method
允许在匹配要调用的实参与底层方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException
。
(二)invoke()方法:
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException对带有指定参数的指定对象调用由此
Method
对象表示的底层方法。
如果底层方法是静态的,那么可以忽略指定的 obj
参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args
数组长度可以为 0 或 null。
-
参数:
-
obj
- 从中调用底层方法的对象 -
args
- 用于方法调用的参数
返回:
-
使用参数
args
在obj
上指派该对象所表示方法的结果
抛出:
-
IllegalAccessException
- 如果此Method
对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。 -
IllegalArgumentException
- 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。 -
InvocationTargetException
- 如果底层方法抛出异常。 -
NullPointerException
- 如果指定对象为 null,且该方法是一个实例方法。 -
ExceptionInInitializerError
- 如果由此方法引起的初始化失败。
(三)简单实例说明:
就是调用类中的方法,最简单的用法是可以把方法参数化
invoke(class, method)
比如你Test类里有一系列名字相似的方法setValue1、setValue2等等
可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue
如:
public class MyTest{
public static void main(String[] args) {
String [] names ={"tom","tim","allen","alice"};
Class<?> clazz = Test.class;
try {
Method method = clazz.getMethod("sayHi", String.class);
for(String name:names)
method.invoke(clazz.newInstance(),name);
} catch (NoSuchMethodException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (InvocationTargetException e)
{
e.printStackTrace();
} catch (InstantiationException e)
{
e.printStackTrace();
}
}
}
class Test{
public void sayHi(String name)
{
System.out.println("Hi "+name);
}
}