1

我正在尝试使用反射调用方法

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

提前致谢

4

1 回答 1

2

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

在您使用可变参数的情况下,您是使用参数明确请求Method 对象:String, String, String, Object[]

所以你必须调用具有相同参数的方法:

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

要以一般方式了解您的问题,请参阅此主题

于 2013-02-12T10:23:32.953 回答