Tengo un Class
objeto. Quiero determinar si el tipo que Class
representa el objeto implementa una interfaz específica. Me preguntaba cómo se podría lograr esto.
tengo el siguiente código. Básicamente, lo que hace es obtener una matriz de todas las clases en un paquete específico. Luego, quiero pasar por la matriz y agregar los objetos Class que implementan una interfaz a mi mapa. El problema es que isInstance()
toma un objeto como parámetro. No puedo crear una instancia de una interfaz. Así que estoy un poco perdido con esto. ¿Algunas ideas?
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
usuario489041
fuente
fuente
Class
instancias no serán compatibles. Podrías ver errores comojava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
o algo similarmente inexplicable.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
andclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
yinstance = (MyIntf) classToLoad.newInstance();
funciona como un encanto.puede usar la siguiente función para obtener todas las interfaces implementadas
fuente
Puede usar
class.getInterfaces()
y luego verificar para ver si la clase de interfaz está allí.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 } }
fuente
isAssignableFrom
como menciona Flavio.isAssignableFrom
es probable que sea preferible usarlo , puede haber casos en los que necesite escanear la lista de interfaces que implementa una clase mirando los nombres.También puede configurar la instancia agregando ".class"
Class[] classes = ClassUtils.getClasses(handlersPackage); for(Class clazz : classes) { if(Interface.class.isAssignableFrom(clazz)) { retVal.put(clazz.getSimpleName(), clazz); } }
fuente
ClassUtils
no es parte de Java (está en Guava o Spring y otros marcos), el términoInterface
como se usa arriba está destinado a referirse a una interfaz específica que se está probando ( es decir, no es una palabra clave de Java en este contexto), y el propósito deretVal
no se explica ni se menciona en ninguna parte.