我的问题是,如何使用反射调用方法,提供调用者对象和多个参数,,而不提供调用者对象类型和参数类型,也无需调用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
这不可能吗?或者有没有办法实现呢?