Vérifier le type de champ primitif
-
19-09-2019 - |
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 long
s. Il est assez facile de distinguer les Long
s 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?
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
ouLong.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