Controllare il tipo di campo primitivo
-
19-09-2019 - |
Domanda
Sto cercando di determinare il tipo di un campo su un oggetto. Non conosco il tipo di oggetto quando viene passato a me, ma ho bisogno di trovare campi che sono long
s. E 'abbastanza facile distinguere le Long
s in scatola ma il long
primitiva sembra più difficile.
I possono fare in modo che gli oggetti passati mi hanno solo Longs
, non i primitivi, ma io non preferisco. Quindi quello che ho è:
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
}
}
Un modo hacky, che sembra funzionare, è questa:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class) || clazz.getName().equals("long")) {
// found one
}
}
Mi piacerebbe davvero un modo più pulito per fare questo se ce n'è uno. Se non c'è modo migliore allora penso che richiedono gli oggetti che ricevo di usare solo Long
(non long
) sarebbe un'API migliore.
Tutte le idee?
Soluzione
Si sta utilizzando la costante sbagliato per verificare la presenza di primitive lunghe - utilizzare Long.TYPE
, ogni altro tipo primitivo può essere trovata con un nome simile costante sulla confezione. ad esempio:. Byte.TYPE
, Character.TYPE
, etc
Altri suggerimenti
o.getClass().getField("fieldName").getType().isPrimitive();
Si può semplicemente utilizzare
boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class
Se si sta utilizzando la riflessione, perché ti importa, perché fare questo controllo a tutti. I metodi get / set usano sempre gli oggetti in modo non c'è bisogno di sapere se il campo è un tipo primitivo (a meno che non si tenta di impostare un tipo primitivo al valore nullo.)
In realtà, per il metodo get () non è necessario sapere quale tipo si tratta. Si può fare
// any number type is fine.
Number n = field.get(object);
long l = n.longValue();
Se non siete sicuri se si tratta di un tipo di numero che si può fare
Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
Number n = (Number) o;
long l = n.longValue();
-
Per rilevare i campi di tipo
long
usolong.class
oLong.TYPE
. -
Per rilevare i campi di tipo
Long
usoLong.class
.
Esempio:
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
}
}
Avviso :
Long.TYPE
è statico membro costante ed è equivalente a long.class
.
forma frammento di codice 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();
Controlla anche per rispondere per Differenza tra Integer.class e Integer.TYPE domanda