it-swarm.com.de

Überprüfen Sie, ob ein Objekt zu einer Klasse in Java gehört

Gibt es eine einfache Möglichkeit zu überprüfen, ob ein Objekt zu einer bestimmten Klasse gehört? Zum Beispiel könnte ich tun

if(a.getClass() = (new MyClass()).getClass())
{
    //do something
}

dies erfordert jedoch, dass jedes Mal ein neues Objekt im laufenden Betrieb instanziiert wird, nur um es zu verwerfen. Gibt es eine bessere Möglichkeit zu überprüfen, ob "a" zur Klasse "MyClass" gehört?

63
chimeracoder

Das in den anderen Antworten beschriebene Schlüsselwort instanceof ist normalerweise das, was Sie möchten. Denken Sie daran, dass instanceof auch für Superklassen true zurückgibt.

Wenn Sie sehen möchten, ob ein Objekt eine direkte Instanz einer Klasse ist, können Sie die Klasse vergleichen. Sie können das Klassenobjekt einer Instanz über getClass() abrufen. Und Sie können über ClassName.class Statisch auf eine bestimmte Klasse zugreifen.

Also zum Beispiel:

if (a.getClass() == X.class) {
  // do something
}

Im obigen Beispiel ist die Bedingung wahr, wenn a eine Instanz von X ist, aber nicht, wenn a eine Instanz einer Unterklasse von X ist.

Im Vergleich:

if (a instanceof X) {
    // do something
  }

Im Beispiel instanceof ist die Bedingung wahr, wenn a eine Instanz von X ist oder wenn a eine Instanz einer nterklasse) ist von X.

Meistens hat instanceof recht.

156
dhm

Wenn Sie dies jemals dynamisch tun müssen, können Sie Folgendes verwenden:

if (clazz.isInstance(a)) {
      // do something
}

dabei ist clazz eine Instanz von Class .

21
gdejohn

Verwenden Sie den Operator instanceof :

if(a instanceof MyClass)
{
    //do something
}
16
Jacob Relkin

Ich bin mit der bereits erwähnten Verwendung von instanceof einverstanden.

Ein zusätzlicher Vorteil der Verwendung von instanceof ist, dass bei Verwendung mit einer null -Referenz instanceof von false zurückgegeben wird, während a.getClass() auslöst a NullPointerException.

4
Justin Muller

Versuchen Sie den Operator instanceof.

4
Kos

Der übliche Weg wäre:

if (a instanceof A)

Es gibt jedoch Fälle, in denen dies nicht möglich ist, z. B. wenn A in einem generischen Argument steht.

Aufgrund der Löschung von Java wird Folgendes nicht kompiliert:

<A> boolean someMethod(Object a) {
    if (a instanceof A)
    ...
}

und das Folgende wird nicht funktionieren (und wird eine unchecked cast Warnung erzeugen):

<A> void someMethod(Object a) {
    try {
        A casted = (A)a;    
    } catch (ClassCastException e) {
         ...
    }
}

Sie können zur Laufzeit nicht nach A umwandeln, da A zur Laufzeit im Wesentlichen Object ist.

Die Lösung für solche Fälle ist die Verwendung eines Class anstelle des generischen Arguments:

void someMethod(Object a, Class<A> aClass) {
    if (aClass.isInstance(a)) {
       A casted = aClass.cast(a);
       ...
    }
}

Sie können die Methode dann wie folgt aufrufen:

someMethod(myInstance, MyClass.class);
someMethod(myInstance, OtherClass.class);
2
Martin Konicek