Mam Class
przedmiot. Chcę ustalić, czy typ, który Class
reprezentuje obiekt, implementuje określony interfejs. Zastanawiałem się, jak można to osiągnąć?
Mam następujący kod. Zasadniczo pobiera tablicę wszystkich klas w określonym pakiecie. Następnie chcę przejść przez tablicę i dodać obiekty Class, które implementują interfejs do mojej mapy. Problem polega na tym, że isInstance()
przyjmuje obiekt jako parametr. Nie mogę utworzyć instancji interfejsu. Więc jestem z tym trochę zagubiony. Jakieś pomysły?
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
źródło
źródło
Class
instancje nie będą kompatybilne. Możesz zobaczyć błędy, takie jakjava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
lub coś podobnie niewytłumaczalnego.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
aclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
iinstance = (MyIntf) classToLoad.newInstance();
działa jak czar.możesz użyć poniższej funkcji, aby uzyskać wszystkie zaimplementowane interfejsy
źródło
Możesz użyć,
class.getInterfaces()
a następnie sprawdzić, czy klasa interfejsu jest tam.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 } }
źródło
isAssignableFrom
jak wspomina Flavio.isAssignableFrom
jest prawdopodobnie preferowane, mogą wystąpić przypadki, w których trzeba będzie przejrzeć listę interfejsów implementowanych przez klasę, patrząc na nazwy.Możesz też ustawić instancję, dodając „.class”
Class[] classes = ClassUtils.getClasses(handlersPackage); for(Class clazz : classes) { if(Interface.class.isAssignableFrom(clazz)) { retVal.put(clazz.getSimpleName(), clazz); } }
źródło
ClassUtils
nie jest częścią Javy (jest w Guava, Spring i innych frameworkach), terminInterface
użyty powyżej ma odnosić się do konkretnego testowanego interfejsu ( tj. nie jest to słowo kluczowe Java w tym kontekście), a cel funkcjiretVal
nie jest nigdzie wyjaśniony ani wymieniony.