Как узнать, является ли поле экземпляром типа через отражение? - PullRequest
52 голосов
/ 14 февраля 2010

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

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

o.getClass().getFields();

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

field.getType();

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

Ответы [ 4 ]

60 голосов
/ 14 февраля 2010

Вы должны использовать isAssignableFrom .

45 голосов
/ 14 февраля 2010

Довольно барочное имя Class.isAssignableFrom - это то, что вам нужно. Я обычно заканчиваю тем, что должен прочитать Javadoc, чтобы убедиться, что я правильно понял:

Определяет, является ли класс или интерфейс представленный этим объектом класса либо такой же, либо суперкласс или суперинтерфейс, класс или интерфейс представлен указанным Параметр класса. Возвращает истину, если так; в противном случае возвращается false. Если этот объект класса представляет примитивный тип, этот метод возвращает истина, если указанный параметр класса именно этот объект класса; в противном случае возвращается 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());
         }
      }
   }
}
14 голосов
/ 25 января 2011

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

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

0 голосов
/ 15 декабря 2017

В случае NullPointerException вы можете использовать org.springframework.util.TypeUtils # isAssignable (java.lang.reflect.Type, java.lang.reflect.Type) вместо java.lang.Class # IsAssignableFrom

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