web-dev-qa-db-de.com

Die Überprüfung eines Klassentyps (.class) entspricht einem anderen Klassentyp

Ist der folgende Code gültig?

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

myMethod (OtherClass.class);

Wenn nicht, gibt es einen anderen Ansatz, bei dem ich überprüfen kann, ob eine übergebene Klasse (Class Type) den Typ MyClass hat?

Danke!

31
Fahim

Ja, dieser Code ist gültig, wenn die beiden Klassen vom selben Klassenladeprogramm geladen wurden. Wenn Sie möchten, dass die beiden Klassen auch dann als gleich behandelt werden, wenn sie von different classloaders geladen wurden, möglicherweise von verschiedenen Standorten aus, basierend auf dem vollständig qualifizierten Namen, vergleichen Sie stattdessen nur vollständig qualifizierte Namen.

Beachten Sie, dass Ihr Code nur eine genaue Übereinstimmung berücksichtigt, jedoch nicht die Art von "Zuweisungskompatibilität" bietet, die beispielsweise (instanceof) ausgeführt wird, wenn Sie sehen, ob ein Wert auf ein Objekt verweist, das eine Instanz einer bestimmten Instanz ist Klasse. Dafür möchten Sie sich Class.isAssignableFrom anschauen.

46
Jon Skeet

Ich möchte die kanonischen Namen lieber vergleichen, um ganz sicher zu sein, classType.getCanonicalName (). Equals (MyClass.class.getCanonicalName ()).

Beachten Sie, dass dies zu anonymen und inneren Klassen führen kann. Wenn Sie sie verwenden, können Sie stattdessen getName verwenden.

4
Slash

Das hat bei mir funktioniert 

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

Verwenden Sie nicht classType.getCanonicalName().equals(MyClass.class.getCanonicalName()) Die oben genannten Punkte werden keine Generics berücksichtigen (alle Karten sind gleich, alle Sets sind gleich usw.)

0
hansSolo

Ich denke, Sie suchen nach instanceof.

Animal a = new Tiger();
System.out.println(a instanceof Tiger); // true
System.out.println(a instanceof Animal); //true

Alternativ könnten Sie zwei Klassen mit vergleichen

a.getClass() == b.getClass()
0
alex