使用反射调用方法时,Last Variable参数不可选

时间:2013-02-12 10:16:34

标签: java reflection

我正在尝试使用反射

调用方法
Method mi = TestInterface.class.getMethod("TestMethod", java.lang.String.class,java.lang.String.class,java.lang.String.class,java.lang.Object[].class);

此方法有3个必需的字符串参数,最后一个参数,即变量参数是可选的。

但是,当我按如下方式调用此方法时。

mi.invoke(new TestImplementation(), new Object[]{"arg1", "arg2","arg3"});

然后它给我一个错误java.lang.IllegalArgumentException: wrong number of arguments

但最后的争论应该是可选的吗? 或者这在使用反射调用方法时不起作用

代码:

public interface TestInterface {
    public void TestMethod(String str, String str1, String str2, Object... objects);
} 

public class TestImplementation implements TestInterface {
    public void TestMethod(String str1, String str2, String str3, Object... objects) {
        // ....
    }
}

public static void main(String[] args) throws Exception { 
    // works perfectly
    TestInterface obj = new TestImplementation();
    obj.TestMethod("str", "str1", "str2");
    // doesn't work
    Method mi = TestInterface.class.getMethod("TestMethod", java.lang.String.class, java.lang.String.class,
            java.lang.String.class);
    mi.invoke(new TestImplementation(), new Object[] { "arg1", "arg2", "arg3" });
}

提前致谢

1 个答案:

答案 0 :(得分:2)

在Java中不存在可选参数。您只能覆盖方法或使用varargs

对于varargs,您明确请求方法对象包含参数:String, String, String, Object[]

所以必须使用相同的参数调用方法:

mi.invoke(new TestImplementation(), new Object[]{"arg1", "arg2","arg3", new Object[0]);

要了解您的问题,请参阅this topic