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