Ответ 1
Вы используете неверную константу для проверки длинных примитивов - используйте Long.TYPE
, каждый другой примитивный тип можно найти с одинаковой константой на обертке. например: Byte.TYPE
, Character.TYPE
и т.д.
Я пытаюсь определить тип поля для объекта. Я не знаю тип объекта, когда он передается мне, но мне нужно найти поля, которые являются 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.
Любые идеи?
Вы используете неверную константу для проверки длинных примитивов - используйте 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 всегда используют объекты, поэтому вам не нужно знать, является ли поле примитивным типом (если вы не попытаетесь установить примитивный тип на нулевое значение.)
Фактически, для метода 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();
Также проверьте answer для Разница между вопросом Integer.class и Integer.TYPE