web-dev-qa-db-fra.com

Comment savoir si un champ est une instance d'un type via une réflexion?

Je veux savoir par réflexion si un champ est une instance de type T

Disons que j'ai un objet o. Maintenant, je veux savoir s'il y a des champs qui sont des instances de T. Je peux obtenir tous les champs avec:

o.getClass().getFields();

Je peux obtenir le type du champ avec:

field.getType();

Mais maintenant, je veux savoir si ce type ou n'importe quel supertype est égal à T. Dois-je appeler getSuperclass() récursivement pour vérifier tous les supertypes?

48
c0d3x

Vous devez utiliser isAssignableFrom .

55
fastcodejava

Le Class.isAssignableFrom, plutôt baroque, est ce que vous recherchez. Je finis généralement par lire le javadoc pour être sûr de bien comprendre:

Détermine si la classe ou l'interface représenté par cet objet de classe est soit le même que, ou est une superclasse ou superinterface de, la classe ou interface représentée par le spécifié Paramètre de classe. Il retourne vrai si alors; sinon, il retourne faux. Si Cet objet de classe représente un type primitif, cette méthode retourne true si le paramètre de classe spécifié est exactement cet objet de classe; sinon, il retourne faux.

Plus précisément, cette méthode teste si le type représenté par le Le paramètre de classe spécifié peut être converti au type représenté par cet objet de classe via une identité conversion ou via une référence d’élargissement conversion.

Par exemple:

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

Si vous voulez comparer le type de champ d'une classe personnalisée, essayez ceci. Utilisez .class car seuls les types primitifs ont le type .TYPE.

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

14
Steven Lizarazo
0
DanielJyc