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 long
s. Il est assez facile de distinguer les Long
s 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?
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.
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 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();
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