Pregunta

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

Yo puede asegúrese de que los objetos pasan a mí sólo han Longs, no los primitivos, pero prefiero que no.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
    }
}

Un hacky manera, que parece que funciona, es este:

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 un limpiador de manera de hacer esto si es que hay uno.Si no hay mejor manera, entonces creo que la exigencia de los objetos que reciben a sólo uso Long (no long sería un mejor API.

Alguna idea?

¿Fue útil?

Solución

Usted está utilizando la constante mal para comprobar si hay primitivas largas - Long.TYPE utilizar, entre sí tipo primitivo se puede encontrar con un nombre similar constante en la envoltura. por ejemplo:. Byte.TYPE, Character.TYPE, etc

Otros consejos

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

Puede utilizar sólo

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 utilizan objetos de modo que no es necesario saber si el campo es un tipo primitivo (a menos que se intenta establecer un tipo primitivo con el valor nulo.)

De hecho, para el método get () no es necesario saber qué tipo es. Usted 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();
  • Para detectar los campos con long tipo de uso long.class o Long.TYPE.

  • Para detectar los campos con Long tipo de 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 la Constante estática de los estados y es equivalente a long.class.

el fragmento de código del formulario 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();

Compruebe también que no respuesta para La diferencia entre Integer.class y Entero.TIPO de pregunta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top