it-swarm.com.de

Wie kann ich herausfinden, ob es sich bei einem Feld um eine Instanz eines Objekts handelt?

Ich möchte durch Reflektion herausfinden, ob ein Feld eine Instanz eines Typs ist, T

Nehmen wir an, ich habe ein Objekt o. Jetzt möchte ich wissen, ob es Felder gibt, die eine Instanz von T sind. Ich kann alle Felder mit bekommen:

o.getClass().getFields();

Ich kann den Typ des Feldes erhalten mit:

field.getType();

Nun möchte ich aber wissen, ob dieser Typ oder ein Supertyp gleich T ist. Muss ich getSuperclass() rekursiv aufrufen, um alle Supertypen zu überprüfen?

48
c0d3x

Sie müssen isAssignableFrom verwenden.

55
fastcodejava

Der eher barocke Name Class.isAssignableFrom ist das, wonach Sie suchen. Ich muss am Ende den Javadoc lesen, um sicherzugehen, dass ich ihn richtig herumbekomme:

Bestimmt, ob die Klasse oder Schnittstelle von diesem Class-Objekt dargestellt wird Entweder das Gleiche wie oder ist eine Superklasse oder Superinterface der Klasse oder Schnittstelle, die durch die angegebene .__ dargestellt wird. Klassenparameter. Es gibt true zurück, wenn so; Andernfalls wird falsch zurückgegeben. Ob Dieses Klassenobjekt repräsentiert eine Primitivtyp gibt diese Methode .__ zurück. true, wenn der angegebene Klassenparameter ist genau dieses Klassenobjekt; Andernfalls wird falsch zurückgegeben.

Diese Methode testet insbesondere ob der vom .__ dargestellte Typ. Der angegebene Klassenparameter kann .__ sein. konvertiert in den durch .__ dargestellten Typ. dieses Klassenobjekt über eine Identität Konvertierung oder über eine Erweiterungsreferenz Umwandlung.

Zum Beispiel:

public class X {

   public int i;

   public static void main(String[] args) throws Exception {
      Class<?> myType = Integer.TYPE;
      Object o = new X();

      for (Field field : o.getClass().getFields()) {
         if (field.getType().isAssignableFrom(myType)) {
            System.out.println("Field " + field + " is assignable from type " + o.getClass());
         }
      }
   }
}
45
skaffman

Wenn Sie den Feldtyp einer benutzerdefinierten Klasse vergleichen möchten, sollten Sie dies versuchen, verwenden Sie .class, da nur primitive Typen .TYPE haben.

if(field.getType().isAssignableFrom(**YOURCLASS.class**)){}

14
Steven Lizarazo
0
DanielJyc