Eu tenho um Class
objeto. Quero determinar se o tipo que o Class
objeto representa implementa uma interface específica. Eu queria saber como isso poderia ser alcançado?
Eu tenho o seguinte código. Basicamente, o que ele faz é obter um array de todas as classes em um pacote especificado. Em seguida, desejo percorrer a matriz e adicionar os objetos Class que implementam uma interface ao meu mapa. O problema é que isInstance()
usa um objeto como parâmetro. Não consigo instanciar uma interface. Então, estou meio perdida com isso. Alguma ideia?
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
fonte
fonte
Class
instâncias não serão compatíveis. Você pode ver erros comojava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
ou algo igualmente inexplicável.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
eclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
einstance = (MyIntf) classToLoad.newInstance();
Funciona como um encanto.você pode usar a função abaixo para obter todas as interfaces implementadas
fonte
Você pode usar
class.getInterfaces()
e, em seguida, verificar se a classe de interface está lá.fonte
isAssignableFrom
como Flavio menciona.isAssignableFrom
seja provavelmente preferível, pode haver casos em que você precise examinar a lista de interfaces que uma classe implementa olhando os nomes.Você também pode definir a instância adicionando ".class"
fonte
ClassUtils
não faz parte do Java (está no Guava ou Spring e outras estruturas), o termoInterface
usado acima se destina a referir-se a uma interface específica sendo testada ( ou seja, não é uma palavra-chave Java neste contexto), e o propósito deretVal
não é explicado ou mencionado em qualquer lugar.