Проверить, если класс является подклассом другого класса в Java
Я играю с API отражения Java и пытаюсь обрабатывать некоторые поля. Теперь я застрял с определением типа моих полей. Строки легко, просто сделать myField.getType().equals(String.class). То же самое относится и к другим не производным классам. Но как проверить производные классы? Е. Г. LinkedList как подкласс List. Я не могу найти isSubclassOf(...) или extends(...) метод. Мне нужно пройти через все getSuperClass() и найти мой супекласс самостоятельно?
6 ответов:
вы хотите, чтобы этот метод:
boolean isList = List.class.isAssignableFrom(myClass);, где в целом
List(выше) следует заменитьsuperclassиmyClassследует заменить наsubclassС документация:
определяет, если класс или интерфейс, представленный этим
Classобъект либо совпадает, либо является суперклассом или суперинтерфейсом класса или интерфейса, представленного указанным
другой вариант-instanceof:
Object o =... if (o instanceof Number) { double d = ((Number)o).doubleValue(); //this cast is safe }
instanceof работает на экземплярах, т. е. на объектах. Иногда вы хотите работать непосредственно с классами. В этом случае вы можете использовать asSubClass метод класса class. Некоторые примеры:
1)
Class o=Object.class; Class c=Class.forName("javax.swing.JFrame").asSubclass(o);это будет проходить гладко, потому что JFrame является подклассом объекта. c будет содержать объект класса, представляющий класс JFrame.
2)
Class o=JButton.class; Class c=Class.forName("javax.swing.JFrame").asSubclass(o);это приведет к запуску java.ленг.ClassCastException потому что JFrame не является подклассом JButton. c не будет инициализирован.
3)
Class o=Serializable.class; Class c=Class.forName("javax.swing.JFrame").asSubclass(o);это будет проходить гладко, потому что JFrame реализует Java.io.Serializable интерфейс. c будет содержать объект класса, представляющий класс JFrame.
конечно, необходимый импорт должен быть включен.
это работает для меня:
protected boolean isTypeOf(String myClass, Class<?> superClass) { boolean isSubclassOf = false; try { Class<?> clazz = Class.forName(myClass); if (!clazz.equals(superClass)) { clazz = clazz.getSuperclass(); isSubclassOf = isTypeOf(clazz.getName(), superClass); } else { isSubclassOf = true; } } catch(ClassNotFoundException e) { /* Ignore */ } return isSubclassOf; }
Это улучшенная версия ответа @schuttek. Он улучшен, потому что он правильно возвращает false для примитивов (например, isSubclassOf(int.объект класса.class) = > false), а также правильно обрабатывает интерфейсы (например, isSubclassOf(HashMap.класс, карта.class) = > true).
static public boolean isSubclassOf(final Class<?> clazz, final Class<?> possibleSuperClass) { if (clazz == null || possibleSuperClass == null) { return false; } else if (clazz.equals(possibleSuperClass)) { return true; } else { final boolean isSubclass = isSubclassOf(clazz.getSuperclass(), possibleSuperClass); if (!isSubclass && clazz.getInterfaces() != null) { for (final Class<?> inter : clazz.getInterfaces()) { if (isSubclassOf(inter, possibleSuperClass)) { return true; } } } return isSubclass; } }
рекурсивный метод, чтобы проверить, является ли clazz "дочерним" суперкласса...
улучшенная версия ответа @To_Kra:
protected boolean isSubclassOf(Class<?> clazz, Class<?> superClass) { if (superClass.equals(Object.class)) { // Every class is an Object. return true; } if (clazz.equals(superClass)) { return true; } else { clazz = clazz.getSuperclass(); // every class is Object, but superClass is below Object if (clazz.equals(Object.class)) { // we've reached the top of the hierarchy, but superClass couldn't be found. return false; } // try the next level up the hierarchy. return isSubclassOf(clazz, superClass); } }
Comments