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!
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
.
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.
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 );
}
}
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.)