web-dev-qa-db-fra.com

Vérifier le type de champ primitif

J'essaie de déterminer le type d'un champ sur un objet. Je ne connais pas le type de l'objet quand il m'est transmis mais j'ai besoin de trouver des champs qui sont longs. Il est assez facile de distinguer les Longs encadrés mais le long primitif semble plus difficile.

Je peux m'assurer que les objets qui m'ont été transmis n'ont que Longs, pas les primitives, mais je préfère ne pas. Donc ce que j'ai c'est:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class)) {
        // found one -- I don't get here for primitive longs
    }
}

Une manière hacky, qui semble fonctionner, est la suivante:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}

J'aimerais vraiment une façon plus propre de le faire s'il y en a un. S'il n'y a pas de meilleur moyen, je pense qu'exiger que les objets que je reçois utilisent uniquement Long (pas long) serait une meilleure API.

Des idées?

40
macbutch

Vous utilisez la mauvaise constante pour vérifier les primitives longues - utilisez Long.TYPE, chaque autre type primitif peut être trouvé avec une constante de même nom sur le wrapper. par exemple: Byte.TYPE, Character.TYPE, etc.

66
mP.
o.getClass().getField("fieldName").getType().isPrimitive();
49
Droo

Vous pouvez simplement utiliser

boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class

Si vous utilisez la réflexion, pourquoi vous en souciez-vous, pourquoi faire cette vérification? Les méthodes get/set utilisent toujours des objets, vous n'avez donc pas besoin de savoir si le champ est de type primitif (sauf si vous essayez de définir un type primitif sur la valeur null.)

En fait, pour la méthode get (), vous n'avez pas besoin de savoir de quel type il s'agit. Tu peux faire

// any number type is fine.
Number n = field.get(object);
long l = n.longValue();

Si vous n'êtes pas sûr qu'il s'agisse d'un type de nombre, vous pouvez le faire

Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
     Number n = (Number) o;
     long l = n.longValue();
16
Peter Lawrey
  • Pour détecter les champs de type long, utilisez long.class ou Long.TYPE.

  • Pour détecter les champs de type Long, utilisez Long.class.

Exemple:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    // to detect both Long and long types
    if (Long.class.equals(clazz) || long.class.equals(clazz)) {
        // found one
    }
}

Remarque :

Long.TYPE est un membre constant statique et est équivalent à long.class.

forme de code d'extrait de classe Long

/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();

Vérifiez également réponse pour différence entre Integer.class et Integer.TYPE question

5
ahmed hamdy