Java中通过反射去执行某个方法时,写法需要注意。对反射用的不熟,所以这里记录一下:
获取到Class对象的Method,也就是类的某个方法(静态方法或者实例方法)
invoke执行,invoke()方法是可变长参数,如下
public Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException
{
if (!override) {
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, clazz, obj, modifiers);
}
}
MethodAccessor ma = methodAccessor; // read volatile
if (ma == null) {
ma = acquireMethodAccessor();
}
return ma.invoke(obj, args);
}
都是Object类型,所以第一个参数为实例对象,所以在调用时,一定需要显示的写两个参数,第一个为实例对象,如果为静态方法则传null。第二个参数即被反射执行的方法的形参,如果不为null的话,直接写即可,如果为null,需要写成Object[] 数组类型。文档中写明了,对于null值,他并不知道这个可变长参数的长度,而对于非null,是编译知道的。
伪代码如下:
method.invoke(null, -10000l)
method.invoke(obj, new Object[]{null})