Question

Je suis en train de déterminer le type d'un champ sur un objet. Je ne sais pas le type de l'objet quand il est passé pour moi, mais je dois trouver des champs qui sont longs. Il est assez facile de distinguer les Longs boxed mais la long primitive semble plus difficile.

peut Assurez-vous que les objets transmis me ont seulement Longs, pas les primitives, mais je préfère ne pas. Donc ce que j'ai 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 façon aki, 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
    }
}

Je voudrais vraiment comme un moyen plus propre de le faire s'il y a un. S'il n'y a pas de meilleure façon je pense qu'exiger les objets que je reçois à utiliser uniquement Long (non long) serait une meilleure API.

Toutes les idées?

Était-ce utile?

La solution

Vous utilisez la mauvaise constante pour vérifier les primitives longues - utiliser Long.TYPE, l'autre type primitif peut être trouvé avec un nom similaire constante sur l'emballage. par exemple:. Byte.TYPE, de Character.TYPE, etc

Autres conseils

o.getClass().getField("fieldName").getType().isPrimitive();

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 ça peut vous faire, pourquoi cette vérification du tout. Les méthodes get / set de toujours utiliser des objets de sorte que vous n'avez pas besoin de savoir si le champ est un type primitif (à moins que vous essayez de définir un type primitif à la valeur nulle.)

En fait, la méthode get () vous n'avez pas besoin de savoir quel type il est. Vous pouvez faire

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

Si vous n'êtes pas sûr si elle est un type de numéro, 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();
  • Pour détecter des champs avec le type d'utilisation long long.class ou Long.TYPE.

  • Pour détecter des champs avec le type d'utilisation Long 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
    }
}

Notice :

Long.TYPE est membre statique de la constante et est équivalent à long.class.

forme de code extrait Long classe

/**
 * 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épondre Différence entre la question de Integer.class et Integer.TYPE

scroll top