Я играю с API отражения Java и пытаюсь обработать некоторые поля. Теперь я застрял в определении типа моих полей. Струны легко, просто делай myField.getType().equals(String.class)
. То же самое относится и к другим не производным классам. Но как я могу проверить производные классы? Например, LinkedList
как подкласс List
. Я не могу найти ни один isSubclassOf(...)
или extends(...)
метод. Мне нужно пройти через все getSuperClass()
и найти свой суперкласс самостоятельно?
java
class
reflection
craesh
источник
источник
LinkedList
не является подклассList
. Это внедрение вList
.Ответы:
Вы хотите этот метод:
где в общем случае
List
(выше) следует заменить наsuperclass
иmyClass
следует заменить наsubclass
Из JavaDoc :
Ссылка:
Class.isAssignableFrom(Class)
Связанный:
a) Проверьте, является ли Object экземпляром класса или интерфейса (включая подклассы), которые вы знаете во время компиляции:
Пример:
б) Проверьте, является ли объект экземпляром класса или интерфейса (включая подклассы), который вы знаете только во время выполнения:
Пример:
источник
SUPERCLASS.isAssignableFrom(SUBCLASS)
это сначала смутило меня, хотя на самом деле это очевидно, учитывая наименование.SUPERCLASS.isExtendedBy(SUBCLASS)
было бы намного легче понятьisExtendedBy
является плохим именем, какCLASS.isAssignableFrom(CLASS)
и в действительности (и, следовательно,CLASS.isExtendedBy(CLASS)
также). Это было бы не то, что я ожидал.Другой вариант - instanceof:
источник
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/…Field
. Но я просто хочу «посмотреть» на мой класс и его поля, не хочу «пробовать их».instanceof
также работает для родителей (в данном случаеNumber
), а не только детейinstanceof работает на экземплярах, т.е. на объектах. Иногда вы хотите работать непосредственно с классами. В этом случае вы можете использовать метод asSubClass класса Class. Некоторые примеры:
1)
это пройдет гладко, потому что JFrame является подклассом Object. c будет содержать объект Class, представляющий класс JFrame.
2)
это запустит исключение java.lang.ClassCastException потому что JFrame НЕ является подклассом JButton. c не будет инициализирован.
3)
это пройдет гладко, потому что JFrame реализует интерфейс java.io.Serializable. c будет содержать объект Class, представляющий класс JFrame.
Конечно, необходимый импорт должен быть включен.
источник
Это работает для меня:
источник
Это улучшенная версия ответа @ schuttek. Он улучшен, потому что он правильно возвращает false для примитивов (например, isSubclassOf (int.class, Object.class) => false), а также правильно обрабатывает интерфейсы (например, isSubclassOf (HashMap.class, Map.class) => true).
источник
Рекурсивный метод для проверки,
Class<?>
является ли подкласс другогоClass<?>
...Улучшенная версия @To Кра «S ответ :
источник
// Наследование
// Методы
// Тестируем код
// Результат
источник