Prüfen Art von primitivem Feld
-
19-09-2019 - |
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 long
s sind. Es ist leicht genug, um die boxed Long
s 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?
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 Verwendunglong.class
oderLong.TYPE
zu erkennen. -
Felder mit
Long
Typ VerwendungLong.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