Вопрос

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

Я может убедитесь, что переданные мне объекты имеют только 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
    }
}

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

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

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

Есть какие-нибудь идеи?

Это было полезно?

Решение

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

Другие советы

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

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

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

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

На самом деле, для метода 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();
  • Для обнаружения полей с 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();

Также проверьте наличие ответ для Разница между Integer.class и целым числом.Тип вопрос

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top