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 longs. E 'abbastanza facile distinguere le Longs 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?

È stato utile?

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 uso long.class o Long.TYPE.

  • Per rilevare i campi di tipo Long uso Long.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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top