Подтвердить что ты не робот

Проверить тип примитивного поля

Я пытаюсь определить тип поля для объекта. Я не знаю тип объекта, когда он передается мне, но мне нужно найти поля, которые являются long s. Достаточно просто выделить коробку 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.

Любые идеи?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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();

Ответ 4

  • Для обнаружения полей с типом 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 для Разница между вопросом Integer.class и Integer.TYPE