Неожиданное поведение Class.getMethod - PullRequest
3 голосов
/ 31 января 2010

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

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, и я действительно ожидал, что он будет включен в метод поиска. Должен ли я учитывать это и в моих собственных алгоритмах поиска?

РЕДАКТИРОВАТЬ : Я читал Javadoc, , поэтому позвольте мне подчеркнуть вторую часть вопроса : И если да, у вас есть предложения о том, как сделать это быстро (я уже пришлось добавить несколько пользовательских алгоритмов сопоставления и преобразования, и я не хочу, чтобы это было слишком медленным)?

Ответы [ 4 ]

5 голосов
/ 31 января 2010

Согласно вашему редактированию, вы можете использовать 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 на стандартный вывод.

4 голосов
/ 31 января 2010

Javadoc для Class.getMethod очень явный:

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

Он не предлагает возможности для подтипов.

1 голос
/ 31 января 2010

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

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

0 голосов
/ 31 января 2010

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

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