Une contribution pour toutes les autres réponses si possible ne pas utiliser la réponse la plus récente de méthode isAssignableFrom
même la réponse "pas très bonne" consistant à utiliser clazz.getInterfaces()
a de meilleures performances que isAssignableFrom
.
Une erreur courante pour les développeurs, lorsqu'ils cherchent une réponse à la question du PO, est de préférer isAssignableFrom
lorsqu'une instance est disponible, à tort :
if (IMyInterface.isAssignableFrom(myObject.getClass())) {
...
Dans la mesure du possible, utilisez IMyInterface.class.isInstance
o instanceof
car les deux ont de bien meilleures performances. Bien sûr, comme l'a dit l'OP, ils ont l'inconvénient que vous devez avoir une instance et pas seulement l'icône class
.
if (IMyInterface.class.isInstance(myObject)) {
...
if (myObject instanceof IMyInterface) { // +0.2% slower than `isInstance` (*see benchmark)
...
Une solution encore plus rapide, mais moche, consisterait à stocker un fichier statique Set
avec toutes les classes "valides" au lieu de les vérifier, cette solution peu glorieuse n'est à privilégier que lorsque vous devez tester beaucoup de classes, car ses performances sont supérieures à celles de toutes les autres approches pour l'analyse directe. class
vérifier.
public static final Set<Class<?>> UGLY_SET = Stream.of(MyClass1.class, MyClass2.class, MyClass3.class).collect(Collectors.toCollection(HashSet::new));
if (UGLY_SET.contains(MyClass)) {
...
(*) JMH Indice de référence pour +0,2 %.
Veuillez visiter cette réponse des utilisateurs @JBE , @Yura et @aleksandr-dubinsky, crédits pour eux. De plus, il y a beaucoup de détails dans cette réponse pour que les résultats du benchmark ne soient pas valides, alors je vous invite à y jeter un coup d'œil.