如何在Java中找到重载的方法?
2022-09-03 08:12:27
当写这样的东西
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 中,编译器只接受匹配的方法,而不进行装箱和取消装箱。当从上面调用我的假设时,基元和它们的包装器之间的区别已经丢失了(因为在通过varargs传递参数时会自动装箱)。这个问题似乎没有解决方案,所以让我们忽略它。getMethod
正如答案中所建议的那样,接近。它应该找到最好的匹配,无论它意味着什么。查看MethodUtils可以看出BeanUtils.invokeMethod
.getMatchingAccessibleMethod
- 它对varargs一无所知
- 它是非确定性的
所以我正在寻找更好的东西。