Intereting Posts
Свойство PropertyException при настройке свойства Marshaller с значением eclipselink.media-type: application / json Применение карты текстуры земли a Сфера Должен ли я засеять SecureRandom? Java8 Stream: собирать элементы после выполнения условия Переопределение метода Enum Предотrotation весенней безопасности для перенаправления неверных URL-адресов на страницу входа в систему WebSphere 7. Inject EJB из другого приложения Настроить строковое значение на карте только в том случае, если соответствует пороговым байтам Приращение целочисленной ценности Integer? Файл appoop2.2.0 append имеет значение AlreadyBeingCreatedException Hibernate: Используется mappedBy в classе, который расширяет другой class, аннотированный как RegisteredSubclass? java: Сортировка файлов на основе даты создания обработка параметров файла * с пробелами по RFC 5987 приводит к ‘+’ в именах файлов Попытка использовать голографическую тему в Android не работает spring-boot – Какая часть кода фактически регистрирует сервлет диспетчера для springMVC?

Неожиданное поведение Class.getMethod

Некоторое время назад у меня был аналогичный вопрос при использовании Class.getMethod и autoboxing, и имело смысл реализовать это в вашем собственном алгоритме поиска. Но меня немного смутило то, что следующее не работает:

public class TestClass { public String doSomething(Serializable s) { return s.toString(); } public static void main(String[] args) throws SecurityException, NoSuchMethodException { TestClass tc = new TestClass(); Method m = tc.getClass().getMethod("doSomething", String.class); } } 

String.class реализует интерфейс Serializable, и я действительно ожидал, что он будет включен в метод поиска. Должен ли я учитывать это в своих собственных алгоритмах поиска?

EDIT : я прочитал Javadoc, так что позвольте мне подчеркнуть вторую часть вопроса : И если у вас есть предложения по тому, как это сделать быстро (мне уже пришлось добавить некоторые алгоритмы согласования и преобразования, и я не хочу это слишком медленно)?

В соответствии с вашим редактированием вы можете использовать Class#isAssignableFrom() . Вот пример базового запуска (исключая очевидную обработку (исключение) времени выполнения):

 package com.stackoverflow.q2169497; import java.io.Serializable; import java.lang.reflect.Method; public class Test { public String doSomething(Serializable serializable) { return serializable.toString(); } public static void main(String[] args) throws Exception { Test test = new Test(); for (Method method : test.getClass().getMethods()) { if ("doSomething".equals(method.getName())) { if (method.getParameterTypes()[0].isAssignableFrom(String.class)) { System.out.println(method.invoke(test, "foo")); } } } } } 

Это должно печатать foo в stdout.

Javadoc для Class.getMethod очень ясен :

Параметр parameterTypes представляет собой массив объектов classа, которые идентифицируют формальные типы параметров метода в заявленном порядке.

Он не предоставляет никаких подтипов.

getMethod не предназначен для поиска методов, совместимых с заданными типами параметров – он предназначен для поиска методов с точно указанными типами параметров.

Вам нужно будет вызвать getMethods() чтобы найти все методы, затем фильтровать по имени и количеству параметров, а затем определить, какие из них действительно применимы.

Зачем вы вызываете getMethod со String.class ? Подписи методов точно отображаются. Не имеет смысла искать метод по тем же критериям, как если бы вы их назовете.