При написании чего-то типа
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 в этом отношении немного сложнее.
Собственно, поведение точно так же, как и компилятор, невозможно, так как в Phase 1 компилятор принимает только методы, соответствующие без бокса и распаковки. При вызове моего гипотетического getMethod
сверху различие между примитивами и их оболочками уже потеряно (из-за автобоксинга при передаче аргументов через varargs). Эта проблема, похоже, не имеет решения, поэтому пусть игнорирует ее.
Как было предложено в ответе, BeanUtils.invokeMethod
приближается. Он должен найти лучший матч, что бы это ни значило. Глядя на MethodUtils .getMatchingAccessibleMethod
показывает, что
- он ничего не знает о varargs
- он не детерминирован
поэтому я ищу что-то лучшее.