Подтвердить что ты не робот

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

Я пытаюсь использовать отражение, чтобы определить, реализует ли класс pass-in интерфейс 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<?>)...

4b9b3361

Ответ 1

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

return IsWidget.class.isAssignableFrom(clzz);

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

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

Ответ 2

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

Ответ 3

Вы можете использовать метод 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.

Ответ 4

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