J'ai un Class
objet. Je veux déterminer si le type que l' Class
objet représente implémente une interface spécifique. Je me demandais comment cela pouvait être réalisé?
J'ai le code suivant. Fondamentalement, il obtient un tableau de toutes les classes dans un package spécifié. Je veux ensuite parcourir le tableau et ajouter les objets Class qui implémentent une interface à ma carte. Le problème est qu'il isInstance()
prend un objet comme paramètre. Je ne peux pas instancier une interface. Donc je suis un peu perdu avec ça. Des idées?
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
la source
la source
Class
instances ne seront pas compatibles. Vous pourriez voir des erreurs commejava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
ou quelque chose de similaire inexplicable.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
etclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
etinstance = (MyIntf) classToLoad.newInstance();
fonctionne comme un charme.vous pouvez utiliser la fonction ci-dessous pour obtenir toutes les interfaces implémentées
la source
Vous pouvez utiliser
class.getInterfaces()
, puis vérifier si la classe d'interface s'y trouve.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 } }
la source
isAssignableFrom
comme le mentionne Flavio.isAssignableFrom
soit probablement préférable, il peut y avoir des cas où vous devez parcourir la liste des interfaces qu'une classe implémente en regardant les noms.Vous pouvez également définir l'instance en ajoutant ".class"
Class[] classes = ClassUtils.getClasses(handlersPackage); for(Class clazz : classes) { if(Interface.class.isAssignableFrom(clazz)) { retVal.put(clazz.getSimpleName(), clazz); } }
la source
ClassUtils
ne fait pas partie de Java (il est dans Guava ou Spring et d'autres frameworks), le termeInterface
utilisé ci-dessus est destiné à faire référence à une interface spécifique en cours de test ( c'est-à-dire, ce n'est pas un mot-clé Java dans ce contexte), et le but deretVal
n'est expliqué ni mentionné nulle part.