У меня есть Class
объект. Я хочу определить, Class
реализует ли тип, который представляет объект, определенный интерфейс. Мне было интересно, как этого можно достичь?
У меня есть следующий код. По сути, он получает массив всех классов в указанном пакете. Затем я хочу пройтись по массиву и добавить объекты класса, реализующие интерфейс на мою карту. Проблема в том, isInstance()
что в качестве параметра используется объект. Я не могу создать интерфейс. Так что я немного растерялся. Любые идеи?
Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
{
retVal.put(clazz.getSimpleName(), clazz);
}
}
java
reflection
user489041
источник
источник
Class
экземпляра не будут совместимы. Вы могли увидеть ошибки вродеjava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
или что-то подобное необъяснимое.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
иclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
иinstance = (MyIntf) classToLoad.newInstance();
работает как шарм.вы можете использовать приведенную ниже функцию, чтобы получить все реализованные интерфейсы
источник
Вы можете использовать,
class.getInterfaces()
а затем проверить, есть ли там класс интерфейса.Class someInterface; // the interface you want to check for Class x; // Class[] interfaces = x.getInterfaces(); for (Class i : interfaces) { if (i.toString().equals(someInterface.toString()) { // if this is true, the class implements the interface you're looking for } }
источник
isAssignableFrom
как упоминает Флавио, гораздо проще и чище .isAssignableFrom
, вероятно, предпочтительнее, могут быть случаи, когда вам нужно просмотреть список интерфейсов, реализуемых классом, просмотрев их имена.Вы также можете установить экземпляр, добавляющий ".class"
Class[] classes = ClassUtils.getClasses(handlersPackage); for(Class clazz : classes) { if(Interface.class.isAssignableFrom(clazz)) { retVal.put(clazz.getSimpleName(), clazz); } }
источник
ClassUtils
не является частью Java (он находится в Guava, Spring и других фреймворках), термин,Interface
используемый выше, предназначен для обозначения конкретного тестируемого интерфейса ( т.е. в данном контексте это не ключевое слово Java), иretVal
нигде не объясняется и не упоминается его назначение.