2009-12-11 19 views
35

Estoy tratando de determinar el tipo de campo en un objeto. No sé el tipo de objeto cuando se me pasa, pero necesito encontrar campos que son long s. Es bastante fácil distinguir el Long s en caja, pero la primitiva long parece más difícil.Verifique el tipo de campo primitivo

I puedo asegúrate de que los objetos que me pasan solo tienen Longs, no las primitivas, pero prefiero no hacerlo. Así que lo que tengo es:

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

Una manera hacky, que parece funcionar, es la siguiente:

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

Realmente me gustaría una forma más limpia de hacer esto, si es que existe. Si no hay una mejor manera, entonces creo que requerir que los objetos que recibo solo usen Long (no long) sería una mejor API.

¿Alguna idea?

Respuesta

59

Está utilizando la constante incorrecta para verificar las primitivas Largas - use Long.TYPE, cada una de las primitivas se puede encontrar con una constante con el mismo nombre en la envoltura. por ejemplo: Byte.TYPE, Character.TYPE, etc.

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

Sí Miré a eso, pero necesito saber si se trata de un largo primitiva no sólo si es un primitivo es decir, coincide con todas las primitivas largas, pero no con las entradas ni los bytes, etc. – macbutch

+1

si es una primitiva, quiero establecer su valor predeterminado. –

15

sólo puede utilizar

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

Si está utilizando la reflexión, ¿por qué te importa, ¿por qué hacer esta comprobación en absoluto. Los métodos get/set siempre usan objetos, por lo que no necesita saber si el campo es de tipo primitivo (a menos que intente establecer un tipo primitivo en el valor nulo).

De hecho, para el método get () no necesita saber de qué tipo es. Se puede hacer

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

Si no está seguro de si se trata de un tipo de número que puede hacer

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

Gracias, yo tampoco sabía sobre long.class. No tengo tiempo para probarlo, pero no creo que el resto de su comentario se aplique en mi caso particular (corríjanme si estoy equivocado. Si hago esto: Clase returnType = m.getReturnType(); if (returnType.equals (Long.class)) { // hacer las cosas } No creo que funcione, igual tendría que comprobar long.class o Long.TYPE. Si pudiera simplemente llamar a todos los métodos get ...(), podría simplemente verificar lo que se devuelve (pero no puedo hacerlo). Por favor, avíseme si he entendido mal (probablemente ...). – macbutch

+0

Espero que pueda leer eso ... Olvidé que el formato no saldría .(( – macbutch

+0

intento; if (retur) nType == Long.class || returnType == long.class) –

3
  • Para detectar campos con long uso o tipo long.classLong.TYPE.

  • Para detectar campos con Long escriba el uso Long.class.

Ejemplo:

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

Aviso:

Long.TYPE es miembro constante estática y es equivalente a long.class.

fragmento forma de código Long Clase

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

Comprueba también answer para Difference between Integer.class and Integer.TYPE pregunta

Cuestiones relacionadas