Java Method的invoke方法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章