Как определить, реализует ли 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<?>)
...
Ответы
Ответ 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
и попробовать и поймать.