web-dev-qa-db-fra.com

Vérifier un type de classe (.class) est égal à un autre type de classe

Le code suivant est-il valide?

void myMethod (Class classType) {
   if (classType == MyClass.class) {
       // do something
   }
}

myMethod (OtherClass.class);

Sinon, existe-t-il une autre approche permettant de vérifier si une classe (type de classe) passée est de type - MyClass?

Merci!

31
Fahim

Oui, ce code est valide - si les deux classes ont été chargées par le même chargeur de classes. Si vous souhaitez que les deux classes soient traitées de manière égale, même si elles ont été chargées par différent classloaders, éventuellement à partir d'emplacements différents, en fonction du nom complet, comparez simplement les noms complets.

Notez que votre code considère uniquement une correspondance exacte , cependant - il ne fournira pas le type de "compatibilité d’affectation" que (par exemple) instanceof permet de voir si une valeur fait référence à un objet qui est une instance d’une donnée donnée. classe. Pour cela, vous voudriez regarder Class.isAssignableFrom.

46
Jon Skeet

Je préférerais comparer les noms canoniques pour en être absolument sûr, classType.getCanonicalName (). Equals (MyClass.class.getCanonicalName ()).

Notez que cela peut entraîner des problèmes avec les classes anonymes et internes. Si vous les utilisez, envisagez plutôt d'utiliser getName.

4
Slash

Cela a fonctionné pour moi 

public class Test
{

void myMethod (Class classType) {
    System.out.println(classType.isAssignableFrom(Test.class));   
}

public static void main(String[] args) {
    Test t = new Test();
    t.myMethod( String.class );

}

}
2
Vadim Gulyakin

N'utilisez pas classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) Ce qui précède ne prend en compte aucun générique (toutes les cartes sont identiques, tous les ensembles identiques, etc.)

0
hansSolo