Как определить, реализует ли класс Java определенный интерфейс

Я пытаюсь использовать отражение, чтобы определить, реализует ли переданный класс IsWdidget интерфейс:

public boolean isAWidget(Class<?> clzz) {
    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());
    Class<?>[] impls = runtimeClass.getInterfaces();
    for(Class<?> clz : impls)
        if(clz.getName().equals(IsWidget.class.getName()))
            return true;

    return false;
}

Это лучший / самый эффективный способ определить это? Я также вижу IsWidget.class.isAssignableFrom(Class<?>) метод...

4 ответов


Я бы использовал isAssignableFrom метод, чтобы определить, если IsWidget - это суперинтерфейс:

return IsWidget.class.isAssignableFrom(clzz);

процитировать из связанного Javadoc выше:

определяет, если класс или интерфейс, представленный этим объектом класса это либо то же самое, что и суперкласс, либо суперинтерфейс класс или интерфейс, представленный указанным параметром Class.


1) это не имеет никакого смысла

  Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());

попробуйте это с любым классом

    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());
    System.out.println(runtimeClass == clzz);

вы получаете

true

поэтому, если вы удалите эту строку и работаете непосредственно с clzz, это уже более эффективно

2) попробовать этот

class X extends Thread {
}

public static void main(String[] args) throws ClassNotFoundException {
    System.out.print(Arrays.toString(X.class.getInterfaces()));
}

вы получаете

[]

это похоже на то, что делает ваш func, но на самом деле X реализует Runnable

3), и это действительно эффективное решение, чтобы проверить, если класс реализует интерфейс

    System.out.print(Runnable.class.isAssignableFrom(X.class));

выход

true

можно использовать getInterfaces() метод, если у вас есть Class "объект".

    Class c[] = clzz.getInterfaces();   
    if(Arrays.asList(c).contains(IsWidget.class))
    {
        return true;
    }

метод getInterfaces дает вам массив Class представление interfaces. Или вы также можете использовать метод isAssignableFrom следующим образом:

IsWidget.class.isAssignableFrom(clzz);

если у вас Object можно использовать instanceof метод.


Если это работает, это должно быть хорошо. Вы также можете попробовать вызвать cast метод Class класс и попытаться поймать.