У меня есть класс с именем Attributes, в котором есть несколько переменных экземпляра, перечисленных ниже:

public class Attributes {
   protected A variable1;
   protected B variable2;
   protected C variables3;
   
   /*
     Getters and Setters of each method.
  */
   
}

Мне нужен список всех типов переменных экземпляра, присутствующих в классе.

Вывод: [A,B,C]

Он содержит все возможные типы данных, присутствующие в этом классе.

Может кто-нибудь предложить способ?

ПРИМЕЧАНИЕ. Я видел отражение, но я думаю, что это полезно, только если мы заполнили значения для этих переменных и хотим получить значения и имена этих переменных, а не типы.

0
Shivanshu 23 Сен 2021 в 11:21

3 ответа

Лучший ответ

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

Arrays.stream(Attributes.class.getDeclaredFields()).map(Field::getType).collect(Collectors.toList())

Если getFields() вернет массив всех полей в классе (а не его экземпляры, вы ссылаетесь на класс, а не на экземпляр класса). Часть map() сопоставит поле с его типом класса. И collect(Collectors.toList()) просто получит результат потока типа Class В список. Если вам не нужны только отдельные типы классов, поэтому без дубликатов просто используйте вместо них toSet().

2
L_Cleo 23 Сен 2021 в 08:32

Вы можете использовать отражение для доступа к Field, а затем получить его тип:

См .: Field.getType ( ) && Класс. getDeclaredFields ()

2
Nice Books 23 Сен 2021 в 08:29

Вы можете использовать reflection, чтобы получить type вот так:

class Scratch {

    public static class Test {
        private int a;
        private long b;
    }

    public static void main(String[] args) {
        Field[] fields = Test.class.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            System.out.println("Type: " + fields[i].getType());
        }
    }

}

Выход:

Type: int
Type: long
2
Pilpo 23 Сен 2021 в 08:31