2009-12-11 18 views
35

Ich versuche, den Typ eines Feldes auf einem Objekt zu bestimmen. Ich kenne den Typ des Objekts nicht, wenn es an mich übergeben wird, aber ich muss Felder finden, die long s sind. Es ist einfach genug, um die Boxs zu unterscheiden, aber das primitive long scheint schwieriger.Überprüfen Sie den Typ des primitiven Felds

I kann stellen Sie sicher, dass die Objekte an mich übergeben haben nur Longs, nicht die Primitiven, aber ich würde 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 
    } 
} 

A 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 Verwendung der Objekte, die ich erhalte, nur Long (nicht long) zu verwenden, eine bessere API wäre.

Irgendwelche Ideen?

Antwort

59

Sie verwenden die falsche Konstante, um nach Long-Primitiven zu suchen - verwenden Sie Long.TYPE, jeder andere primitive Typ kann mit einer ähnlich benannten Konstante auf dem Wrapper gefunden werden. zB: Byte.TYPE, Character.TYPE usw.

40
o.getClass().getField("fieldName").getType().isPrimitive(); 
+0

Ja ich an, dass aussah, aber ich wissen muss, wenn es eine lange primitiv ist nur nicht, ob es ist ein Primitiv. d. h., alle langen Primitive, aber keine Inte oder Bytes usw., müssen übereinstimmen. – macbutch

+1

Wenn es sich um ein primitives Element handelt, möchte ich seinen Standardwert festlegen !!! –

15

können Sie nur

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

verwenden Wenn Sie Reflektion verwenden, warum kümmern Sie, warum überhaupt diese Prüfung zu tun. Die Get/Set-Methoden verwenden immer Objekte, so dass Sie nicht wissen müssen, ob das Feld ein primitiver Typ ist (es sei denn, Sie versuchen, einen primitiven Typ auf den Nullwert zu setzen).

In der Tat, für die Methode get () Sie müssen nicht wissen, um welchen Typ es sich handelt. Sie können

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

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

Object o = field.get(object); // will always be an Object or null. 
if (o instanceof Number) { 
    Number n = (Number) o; 
    long l = n.longValue(); 
+0

Danke, ich wusste auch nichts von long.class. Ich habe keine Zeit, es zu testen, aber ich glaube nicht, dass der Rest Ihres Kommentars in meinem speziellen Fall gilt (korrigieren Sie mich, wenn ich falsch liege. Wenn ich dies tue: Klasse returnType = m.getReturnType(); if (returnType.equals (Long.class)) { // mach Sachen } Ich denke nicht, dass es funktioniert - ich müsste immer noch nach long.class oder Long.TYPE suchen. Wenn ich nur alle get ...() Methoden aufrufen könnte, dann könnte ich einfach überprüfen, was zurückgegeben wird (aber ich kann das nicht tun.) Bitte lassen Sie mich wissen, wenn ich falsch verstanden habe (wahrscheinlich ...). – macbutch

+0

Ich hoffe, Sie können das lesen ... Ich habe vergessen, die Formatierung würde nicht herauskommen. :( – macbutch

+0

versuchen; if (return nType == Long.class || returnType == long.class) –

3
  • Um long.class oder Long.TYPE tun können Felder mit long Typ Verwendung zu erkennen.

  • Um Felder mit Typ zu erkennen, verwenden Sie Long.class.

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(); 

Auch für Difference between Integer.class and Integer.TYPE Frage für answer überprüfen

Verwandte Themen