我正在尝试使用反射
调用方法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" });
}
提前致谢
答案 0 :(得分:2)
在Java中不存在可选参数。您只能覆盖方法或使用varargs。
对于varargs,您明确请求方法对象包含参数:String, String, String, Object[]
。
所以必须使用相同的参数调用方法:
mi.invoke(new TestImplementation(), new Object[]{"arg1", "arg2","arg3", new Object[0]);
要了解您的问题,请参阅this topic。