Как найти перегруженный метод в Java?

При написании чего-то вроде

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показывает, что

  • он ничего не знает о вараргах
  • это не -детерминировано

так что я ищу что-то лучше.

16
задан maaartinus 17 April 2014 в 01:33
поделиться