写类似的东西时
doit(43, 44, "hello");
编译器知道要调用哪个重载方法。当我想通过反射做同样的事情时,我需要找出自己,方法是
doit(Integer, double, CharSequence...);
并通过类似的方式获得它
Class[] types = {Integer.class, double.class, CharSequence[].class};
declaringClass.getDeclaredMethod("doit", types);
我想知道是否已经有一些东西可以让我写
Method m = getMethod(declaringClass, "doit", 43, 44, "hello");
我想知道是否有人已经这样做了,因为JLS在这方面有点复杂。
实际上,与编译器完全一样的行为是不可能的,因为在阶段 1中,编译器只接受匹配的方法,而无需装箱和拆箱。当从上面调用我的假设getMethod
时,原语和它们的包装器之间的区别已经丢失(因为通过可变参数传递参数时的自动装箱)。这个问题似乎没有解决办法,所以我们忽略它。
正如答案中所建议的那样,BeanUtils.invokeMethod
接近了。它应该找到最好的匹配,不管它意味着什么。查看MethodUtils.getMatchingAccessibleMethod
表明
- 它对可变参数一无所知
- 这是不确定的
所以我正在寻找更好的东西。