Проверить, если класс является подклассом другого класса в Java



Я играю с API отражения Java и пытаюсь обрабатывать некоторые поля. Теперь я застрял с определением типа моих полей. Строки легко, просто сделать myField.getType().equals(String.class). То же самое относится и к другим не производным классам. Но как проверить производные классы? Е. Г. LinkedList как подкласс List. Я не могу найти isSubclassOf(...) или extends(...) метод. Мне нужно пройти через все getSuperClass() и найти мой супекласс самостоятельно?

659   6  

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

    Ничего не найдено.