Доступ к перегруженному методу через Reflection Api - PullRequest
1 голос
/ 10 января 2020

Как отличить guish метод, перегруженный классом, используя Reflection, например:

method() и method(int arg)

void invoke(Object object, String methodName, int id) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        object.getClass().getDeclaredMethod(methodName).invoke(object, int.class);
}

И вызов этой функции:

getV(new Object(), "method", 33);

И он возвращает ошибку java.lang.IllegalArgumentException: wrong number of arguments, что означает, что метод без аргументов выбирается по умолчанию. Если я вызову метод без параметра int, он будет работать. Я спрашиваю, как отличить guish перегруженный метод? Я прочитал документы для Class.getDeclaredMethod https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html Также есть старый пост на SO, но оба источника не отвечают на один и тот же вопрос Как найти перегруженный метод в Java? . Ofcourse Class.Object не имеет метода с методом name, я просто использовал его для примера.

1 Ответ

2 голосов
/ 10 января 2020

Вы должны указать типы параметров для метода поиска, а не метода invoke:

void invoke(Object object, String methodName, int id) throws ReflectiveOperationException {
    object.getClass().getDeclaredMethod(methodName, int.class).invoke(object, id);
}

Но имейте в виду, что getClass() возвращает фактический класс, который может быть подклассом предполагаемого класс, тогда как getDeclaredMethod не ищет суперклассы. getMethod выполняет поиск в суперклассах, но рассматривает только public методы.

Чтобы рассмотреть неопубликованные c методы в иерархии типов, вы должны будете самостоятельно выполнить l oop через суперклассы, когда метод не был найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...