2009-12-11 4 views
35

Я пытаюсь определить тип поля на объекте. Я не знаю тип объекта, когда он передается мне, но мне нужно найти поля, которые являются long. Достаточно легко различить коробку Long s, но примитив long кажется более сложным.Проверить тип примитивного поля

I может убедиться, что объекты, переданные мне, имеют только Longs, а не примитивы, но я бы предпочел не. Так что у меня есть:

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

Hacky путь, который, кажется, работает, заключается в следующем:

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

Я бы очень хотел, экологически чистого способа сделать это, если есть один. Если нет лучшего способа, то я думаю, что требуя, чтобы объекты, которые я получаю, использовали только Long (не long), были бы лучшим API.

Любые идеи?

ответ

59

Вы используете неправильную константу для проверки длинных примитивов - используйте Long.TYPE, каждый другой примитивный тип можно найти с одинаковой константой на обертке. например: Byte.TYPE, Character.TYPE и т.д.

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

Да, я смотрел на это, но мне нужно знать, если это длинный примитив не просто ли это является примитивным. т. е. сопоставлять все длинные примитивы, но не ints или байты и т. д. – macbutch

+1

, если это примитив, я хочу установить его значение по умолчанию !!! –

15

Вы можете просто использовать

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

Если вы используете отражение, почему вы заботитесь, почему эту проверку на всех. Методы get/set всегда используют объекты, поэтому вам не нужно знать, является ли поле примитивным типом (если вы не пытаетесь установить примитивный тип на нулевое значение.)

Фактически для метода get () вам не нужно знать, какой тип он есть. Вы можете сделать

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

Если вы не уверены, если это тип номер вы можете сделать

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

Спасибо, я тоже не знал о long.class. У меня нет времени проверить его, но я не думаю, что остальная часть вашего комментария применима в моем конкретном случае (исправьте меня, если я ошибаюсь. Если я это сделаю: Класс returnType = m.getReturnType(); if (returnType.equals (Long.class)) { // do stuff } Я не думаю, что это сработает - мне еще нужно проверить long.class или Long.TYPE. Если бы я мог просто вызвать все методы get ...(), тогда я мог бы просто проверить, что возвращается (но я не могу этого сделать). Пожалуйста, дайте мне знать, если я неправильно понял (вероятно ...). – macbutch

+0

Надеюсь, вы можете прочитать это ... Я забыл, что форматирование не получится. :( – macbutch

+0

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

3
  • Для обнаружения полей с long типа использования long.class или Long.TYPE.

  • Для определения полей с Long использовать тип Long.class.

Пример:

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

Примечание:

Long.TYPE является статическим постоянным членом и эквивалентно long.class.

фрагмент кода формы Long Класс

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

Также проверьте answer для Difference between Integer.class and Integer.TYPE вопрос

Смежные вопросы