通过反射调用带可变参数方法运行失败

我通过反射调用一个带有可变参数的方法是运行失败,代码如下。

public class Main {

    public static void func(Object... objs){
        for (Object obj : objs){
            System.out.println(obj);
        }
    }

    public static class Tester{
        public static void main(String... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            Class<?> clazz = Class.forName("com.xxxx.Main");
            Method method1 = clazz.getMethod("func", Object[].class);
            method1.invoke(null, new Object[]{1, "2"});
        }
    }
}

异常信息如下

Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.zeeker.reflect.Main$Tester.main(Main.java:30)

这其中是有什么猫腻?

慕森王
浏览 615回答 3
3回答

冉冉说

method1.invoke(null, (Object)new Object[]{1,"2"});

慕森卡

//这样子也可以method1.invoke(null, new Object[]{new Object[]{1}});

MYYA

这个主要是兼容问题。为了兼容可变参数出来之前的版本,那时候主要使用数组来实现。所以 如果你穿入得是个数组,jvm会解开 所以包装一下就好了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java