Ich habe ein Class
Objekt. Ich möchte feststellen, ob der Typ, den das Class
Objekt darstellt, eine bestimmte Schnittstelle implementiert. Ich habe mich gefragt, wie dies erreicht werden kann.
Ich habe den folgenden Code. Grundsätzlich wird ein Array aller Klassen in einem angegebenen Paket abgerufen. Ich möchte dann das Array durchgehen und die Klassenobjekte hinzufügen, die eine Schnittstelle zu meiner Karte implementieren. Problem ist, dass isInstance()
ein Objekt als Parameter verwendet wird. Ich kann keine Schnittstelle instanziieren. Ich bin damit irgendwie ratlos. Irgendwelche Ideen?
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
quelle
quelle
Class
Instanzen nicht kompatibel. Sie könnten Fehler wiejava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
oder etwas ähnlich Unerklärliches sehen.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
undclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
undinstance = (MyIntf) classToLoad.newInstance();
funktioniert wie ein Zauber.Mit der folgenden Funktion können Sie alle implementierten Schnittstellen abrufen
quelle
Sie können verwenden
class.getInterfaces()
und dann überprüfen, ob sich die Schnittstellenklasse dort befindet.quelle
isAssignableFrom
wie Flavio erwähnt.isAssignableFrom
wahrscheinlich vorzuziehen ist, kann es Fälle geben, in denen Sie die Liste der von einer Klasse implementierten Schnittstellen anhand der Namen scannen müssen.Sie können die Instanz auch so einstellen, dass ".class" hinzugefügt wird.
quelle
ClassUtils
ist nicht Teil von Java (in Guava oder Spring und anderen Frameworks). Der oben verwendete BegriffInterface
bezieht sich auf eine bestimmte getestete Schnittstelle ( dh es ist in diesem Zusammenhang kein Java-Schlüsselwort), und der Zweck vonretVal
wird nirgendwo erklärt oder erwähnt.