Как определить, реализует ли класс 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
класс и попытаться поймать.