Подтвердить что ты не робот

Как узнать, является ли поле экземпляром типа через отражение?

Я хочу узнать через отражение, если поле является экземпляром некоторого типа T.

Допустим, у меня есть объект o. Теперь я хочу знать, есть ли у него какие-либо поля, которые являются экземплярами T. Я могу получить все поля:

o.getClass().getFields();

Я могу получить тип поля с помощью:

field.getType();

Но теперь я хочу знать, равен ли этот тип или любой супертип T. Должен ли я вызывать getSuperclass() рекурсивно, чтобы убедиться, что все супертипы?

4b9b3361

Ответ 2

Довольно барочно названный Class.isAssignableFrom - это то, что вам нужно. Обычно мне приходится читать javadoc, чтобы убедиться, что я правильно его рассмотрю:

Определяет, является ли класс или интерфейс представленный этим объектом класса либо такой же, как или суперкласс или суперинтерфейсом класса или класса интерфейс, представленный указанным Параметр класса. Он возвращает true, если так; иначе он возвращает false. Если этот объект класса представляет собой примитивный тип, этот метод возвращает true, если указанный параметр класса именно этот объект класса; в противном случае он возвращает false.

В частности, этот метод проверяет является ли тип, представленный указанный параметр класса может быть преобразованный в тип, представленный этот объект класса через идентификатор преобразование или с помощью ссылки на расширение преобразование.

Например:

public class X {

   public int i;

   public static void main(String[] args) throws Exception {
      Class<?> myType = Integer.TYPE;
      Object o = new X();

      for (Field field : o.getClass().getFields()) {
         if (field.getType().isAssignableFrom(myType)) {
            System.out.println("Field " + field + " is assignable from type " + o.getClass());
         }
      }
   }
}

Ответ 3

Если вы хотите сравнить тип поля пользовательского класса, вы должны попробовать это, используйте .class, потому что только примитивные типы имеют .TYPE.

if(field.getType().isAssignableFrom(**YOURCLASS.class**)){}