Проверка возврата метода List <String>с отражением - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь получить тип возвращаемого значения метода, используя отражение, однако мне кажется, что я не могу проверить List<String> конкретно.
Я сделал это очень хаки way:

if (method.getGenericReturnType().getTypeName().equalsIgnoreCase("java.util.List<java.lang.String>"))

Это не совсем то, чем я должен заниматься, поэтому мне было интересно, есть ли лучшее решение.

1 Ответ

1 голос
/ 19 января 2020

method.getGenericReturnType() возвращает java .lang.reflect.Type и, как вы можете видеть в javadocs, у него есть список известных подтипов:

All Known Subinterfaces:
GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType

Таким образом, вы можете использовать чтобы выполнить несколько проверок instanceof:

// is it ParameterizedType - so any type like Type<GenericType, OrMoreTypes>
if (!(method.getGenericReturnType() instanceof ParameterizedType)) return false;
ParameterizedType parametrizedReturnType = (ParameterizedType) method.getGenericReturnType();
// raw type is just a class without generic part
if (parametrizedReturnType.getRawType() != List.class) return false;
if (parametrizedReturnType.getActualTypeArguments().length != 1) return false;
Type firstArg = parametrizedReturnType.getActualTypeArguments()[0];
return firstArg == String.class;

Обратите внимание, что тип может быть более сложным, но все же совместимым со списком, если вы просто хотите прочитать некоторые данные, например, метод может иметь сигнатуру типа ArrayList<? extends String>, а затем проверка вернет false. Если вы хотите также поддерживать такие случаи, лучше использовать некоторые библиотеки, например org. apache .commons.lang3.reflect.TypeUtils.isAssignable , поскольку такие библиотеки позволяют создавать экземпляр определения типа (эти библиотеки просто иметь собственные реализации этих интерфейсов) и выполнять более сложные проверки, такие как isAssignable или isInstance, поскольку, к сожалению, java не предоставляет такой API.

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