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