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})