2010-01-30 2 views
3

Некоторое время назад у меня был similar question при использовании Class.getMethod и autoboxing, и имело смысл реализовать это в вашем собственном алгоритме поиска. Но что действительно меня смутил немного было то, что следующее не работает либо:Неожиданное поведение 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 интерфейс, и я действительно ожидал, что он будет включен в методе поиска. Должен ли я учитывать это в моих собственных алгоритмах поиска?

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

ответ

5

В соответствии с вашими изменениями вы можете использовать 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 на стандартный вывод.

1

getMethod не предназначен, чтобы найти методы, которые совместимую с типами данного параметра - это означало, чтобы найти методы с точно заданных типов параметров.

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

0

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

4

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

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

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

Смежные вопросы