Java 通过反射调用私有静态方法

Java 通过反射调用私有静态方法,java,reflection,Java,Reflection,当我在私有静态方法上调用java.lang.reflect.Method.invoke()方法时,会得到一个“java.lang.IllegalArgumentException:参数数目错误”。我想我尊重javadoc规范,我做错什么了吗?谢谢你的帮助 这是我的密码: public class MyClass { .... private static Object myMethod(String[] stringArray) {...} } 我想在JUnit测试类中测试my

当我在私有静态方法上调用java.lang.reflect.Method.invoke()方法时,会得到一个“java.lang.IllegalArgumentException:参数数目错误”。我想我尊重javadoc规范,我做错什么了吗?谢谢你的帮助

这是我的密码:

public class MyClass {
    ....
    private static Object myMethod(String[] stringArray) {...}
}
我想在JUnit测试类中测试myMethod():

public class MyClassTest {
    private static String[] myArray = {"A", "B", "C"};
    @Test
    public void myMethodTest() {
        Method method = Class.forName("mypackage.MyClass").getDeclaredMethod("myMethod", myArray.getClass());
        method.setAccessible(true);
        method.invoke(null, myArray);
    }
}

您需要将
字符串
包装到对象数组中:

Method method = Class.forName("mypackage.MyClass")
        .getDeclaredMethod("myMethod", myArray.getClass());
method.setAccessible(true);
method.invoke(null, new Object[] {myArray});

method.invoke()
的第二个参数需要方法参数的数组或vararg。对于您的方法,您只有一个参数(恰好也是一个数组),但仍然需要将其包装在数组中。

您需要将字符串包装在对象数组中:

Method method = Class.forName("mypackage.MyClass")
        .getDeclaredMethod("myMethod", myArray.getClass());
method.setAccessible(true);
method.invoke(null, new Object[] {myArray});
method.invoke()
的第二个参数需要方法参数的数组或vararg。对于您的方法,您只有一个参数(恰好也是一个数组),但仍然需要将其包装在一个数组中。

由于
invoke()
将vararg作为参数,Java编译器将您传递的数组的每个元素视为vararg参数,即它认为它等效于

method.invoke(null, "A", "B", "C");
您只需将数组强制转换为对象即可解决此问题:

method.invoke(null, (Object) myArray);
由于
invoke()
将vararg作为参数,因此Java编译器将您传递的数组中的每个元素视为vararg参数,即,它认为它等效于

method.invoke(null, "A", "B", "C");
您只需将数组强制转换为对象即可解决此问题:

method.invoke(null, (Object) myArray);

非常好用!这是我第一次投进Object。。。谢谢非常好用!这是我第一次投进Object。。。谢谢这是解决vararg问题的绝佳方法!感谢您为这个vararg问题提供了出色的解决方案!谢谢