Ответ 1
Вы должны использовать isAssignableFrom.
Я хочу узнать через отражение, если поле является экземпляром некоторого типа T
.
Допустим, у меня есть объект o
. Теперь я хочу знать, есть ли у него какие-либо поля, которые являются экземплярами T
. Я могу получить все поля:
o.getClass().getFields();
Я могу получить тип поля с помощью:
field.getType();
Но теперь я хочу знать, равен ли этот тип или любой супертип T
. Должен ли я вызывать getSuperclass()
рекурсивно, чтобы убедиться, что все супертипы?
Вы должны использовать isAssignableFrom.
Довольно барочно названный 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());
}
}
}
}
Если вы хотите сравнить тип поля пользовательского класса, вы должны попробовать это, используйте .class, потому что только примитивные типы имеют .TYPE.
if(field.getType().isAssignableFrom(**YOURCLASS.class**)){}
В случае NullPointerException
вы можете использовать org.springframework.util.TypeUtils # isAssignable (java.lang.reflect.Type, java.lang.reflect.Type) вместо java.lang.Class # isAssignableFrom