java反射调用方法
先上代码
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public Test(String a) {
}
public Test() {
}
public void say(String str1, String str2) {
System.out.println(str1 + " " + str2);
}
public static void main(String[] args) throws ClassNotFoundException {
Class classType = Class.forName("Test");
Method[] methods = classType.getMethods();
for (Method method : methods) {
method.setAccessible(true);
System.out.println(method.getName());
if (method.getName().equals("say")) {
try {
method.invoke(classType.newInstance(), new Object[]{"a", "b"});
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
}
}
结果:
main
say
a b
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
在结果中可以看到打印了所有方法名称,其中第三行是我调用say方法的输出结果
步骤
- 先获取我们要反射的对象类型
- 获取对象的所有方法
- 执行method.invoke() 其中第一个参数是被反射对象的实例化,如果对象有一个参数构造方法,则必须写一个无参的构造方法,如没有构造方法,默认是一个无参构造方法,第二个参数是我们要invoke方法的参数,因为在代码中我想调用的是say,这个方法有两个参数,所以我传入了一个两个String的数组。