Frage

Ich versuche, den Typ eines Feldes auf einem Objekt zu bestimmen. Ich weiß nicht, die Art des Objekts, wenn es mir passiert ist, aber ich brauche Felder zu finden, die longs sind. Es ist leicht genug, um die boxed Longs zu unterscheiden, aber der primitive long scheint schwieriger.

I können stellen Sie sicher, dass die Objekte nur mir Longs bestanden haben, nicht die Primitive, aber ich möchte lieber nicht. Also, was ich habe, ist:

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
    }
}

Ein hacky Weise, die zu funktionieren scheint, ist dies:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}

Ich würde wirklich wie ein sauberer Weg, dies zu tun, wenn es einen gibt. Wenn es keinen besseren Weg gibt, dann denke ich, dass die Objekte erfordern ich nur erhalten Long zu verwenden (nicht long) wäre eine bessere API sein.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Sie verwenden die falsche Konstante für Long-Primitiven zu überprüfen - verwenden Long.TYPE, jede andere primitive Art kann mit einem ähnlich benannten Konstante auf der Verpackung zu finden. zB:. Byte.TYPE, Character.TYPE, etc

Andere Tipps

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

Sie können einfach verwenden

boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class

Wenn Sie Reflektion verwenden, warum kümmern Sie, warum diese Prüfung bei allen Produkten. Die get / set-Methoden immer Objekte verwenden, so müssen Sie wissen nicht, ob das Feld ein primitiver Typ ist (es sei denn, Sie versuchen, eine primitive Art auf den Nullwert einzustellen.)

In der Tat, für die Methode get () Sie müssen nicht wissen, welche Art es ist. Sie können tun,

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

Wenn Sie nicht sicher sind, ob es sich um eine Nummer Typ Sie tun können,

Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
     Number n = (Number) o;
     long l = n.longValue();
  • Felder mit long Typ Verwendung long.class oder Long.TYPE zu erkennen.

  • Felder mit Long Typ Verwendung Long.class zu erkennen.

Beispiel:

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
    }
}

Hinweis :

Long.TYPE ist statisch Constant Enden und ist äquivalent zu long.class.

Schnipsel Codeform Long Klasse

/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();

für = "https://stackoverflow.com/questions/10195424/difference -zwischen-integer-Klasse-and-integer-Typ "> Differenz zwischen Integer.class und Integer.TYPE Frage

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top