Marque el tipo de primitiva campo
-
19-09-2019 - |
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 long
s.Es bastante fácil distinguir la caja Long
s 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?
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 usolong.class
oLong.TYPE
.Para detectar los campos con
Long
tipo de usoLong.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