在Java中,使用反射调用方法而不提供调用者对象类型和多个参数类型?

时间:2015-08-01 15:17:44

标签: java reflection invoke

我的问题是,如何使用反射调用方法,提供调用者对象和多个参数,,而不提供调用者对象类型和参数类型,也无需调用API。

那是

Student student = new Student();
student.setNameAndClass("John", "1D"); // Method 0

可以替换为

MyMethodUtils.invoke(student, "setNameAndClass", Object[] {"John", "1D"}); // Method 1

其中invoke()方法由JDK方法生成。 如果满足要求,它可以在其他签名中。

我的研究和研究

我在StackOverflow中找不到任何相关的解决方案。 This answer need class list This looks pretty close but it is C# and calling API

我可以像这样制作invoke()方法。

MyMethodUtils.invoke(student, "getNameAndClass"); // Method 2 (no parameters)
MyMethodUtils.invoke(student, "setNameAndClass", Object[] {"John", "1D"},
Class[] {String.class, String.class}); // Method 3 (with multiple parameters but inconvenient to use)

方法2,3正常工作。但是,当我尝试实现方法1(我想要的)时,它只在类型完全匹配时才有效。

例如,如果方法类似于

setMarks(String name, Collection<Integer> marks);

原生调用有效,但反射不是

student.setMarks("John", new ArrayList<Integer>()); //works
MyMethodUtils.invoke(student, "setMarks", "John", new ArrayList<Integer>()); // getMethod() method always cannot find a proper method

这不可能吗?或者有没有办法实现呢?

0 个答案:

没有答案