Как проверить, что метод возвращает коллекцию в Java?

Я хочу проверить, существует ли метод в интерфейсе на основе его сигнатур.

подпись, которую должен иметь метод:

Collection<Foo> methodName(Spam arg0, Eggs arg1, ...)

Я могу найти методы через Class.getMethods() затем найдите имя, параметры и тип возврата соответственно с method.getName(), method.getParameterTypes() и method.getReturnType().

но что я сравниваю с типом возврата, чтобы гарантировать, что только методы, которые возвращают Collection<Foo> выбираются, а не другие сборники?

method.getReturnType().equals(Collection.class) 

так как выше будет верно для всех методов, которые возвращают коллекцию, а не только для тех, которые возвращают Foo коллекция.

3 ответов


есть метод с именем public Type getGenericReturnType() который может вернуть (если это так) a ParameterizedType.

A ParameterizedType может дать вам больше информации о универсальный тип, например Collection<Foo>.

в частности getActualTypeArguments() способ вы можете получить фактический тип для каждого параметра.

здесь ParameterizedType представляет коллекцию и getActualTypeArguments() представляет массив, содержащий Foo

вы можете попробовать это список параметров общий тип:

Type returnType = method.getGenericReturnType();
if (returnType instanceof ParameterizedType) {
    ParameterizedType type = (ParameterizedType) returnType;
    Type[] typeArguments = type.getActualTypeArguments();
    for (Type typeArgument : typeArguments) {
        Class typeArgClass = (Class) typeArgument;
        System.out.println("typeArgClass = " + typeArgClass);
    }
}

источники : http://tutorials.jenkov.com/



параметры универсального типа не сохраняются во время выполнения (т. е. это только функция времени компиляции) в Java, поэтому вы не можете этого сделать.