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

 

你可能感兴趣的:(Java)