Родовой тип родителя класса, используя отражение - PullRequest
0 голосов
/ 15 октября 2018
public class Parent {}

public class A extends Parent {}

public class B {}

public class Test {
    private List<A> aList;
    private List<B> bList;
}

Я играл с отражением и обобщениями и создал эти классы просто для удовольствия.

Теперь я хочу напечатать имена переменных в классе Test, которые имеют тип List<T extends Parent>,Поэтому я хочу печатать только "aList", потому что A расширяет Parent, а B - нет.

До сих пор мне удавалось получить переменные List.Я посмотрел на различные методы отражения, но не смог извлечь тип List <...> и посмотреть, является ли его суперкласс Parent или нет.Вот мой код, который в настоящее время печатает как "aList", так и "bList": -

public static void main(String[] args) {
    Arrays.stream(Test.class.getDeclaredFields())
            .filter(field -> field.getType().equals(List.class)) // && fieldActualTypeExtendsA
            .forEach(field -> System.out.println(field.getName()));
}

Что мне добавить в фильтр?

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете получить доступ к универсальному типу поля с помощью field.getGenericType(), который возвращает реализацию класса ParameterizedType, где метод getActualTypeArguments() возвращает аргументы типа.Это применимо для List, Map и т. Д.

Тогда ваш код для фильтрации по родителю может выглядеть следующим образом:

Arrays.stream(Test.class.getDeclaredFields())
        .filter(field -> field.getType().equals(List.class)
                && field.getGenericType() instanceof ParameterizedType
                && ((Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]).getSuperclass().equals(Parent.class))
        .forEach(field -> System.out.println(field.getName()));

Конечно, вы можете добавить некоторые проверки безопасности - дляпример, является ли массив, возвращаемый getActualTypeArguments(), пустым или нет.

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