Java 如何理解字段是数字?

Java 如何理解字段是数字?,java,reflection,casting,numbers,primitive-types,Java,Reflection,Casting,Numbers,Primitive Types,我有接受字段和对象 public String format(Field field, Object o) {....} 我想知道字段是否可以转换为数字 我注意到,如果这样写(长时间): 返回true 但是 field.getType().isAssignableFrom(Long.class) 返回false 及 也返回false 也 返回ClassCastException 请帮助编写方法,如果字段实际是数字(int,long,byte…,以及所有包装),则返回true,在其他情况下返

我有接受
字段
对象

public String format(Field field, Object o) {....}
我想知道字段是否可以转换为数字

我注意到,如果这样写(长时间):

返回
true

但是

field.getType().isAssignableFrom(Long.class)
返回
false

也返回
false


返回
ClassCastException

请帮助编写方法,如果字段实际是数字(
int
long
byte
…,以及所有包装),则返回
true
,在其他情况下返回
false

有没有比以下更简单的方法:

public String format(Field field, Object o) {
    field.setAccessible(true);
    Object value = null;
    try {
        value = field.get(o);
        if (value instanceof Number) {
            return field.get(o).toString();
        }
    } catch (IllegalAccessException e) {
        ....
    }
   ...
}

使用
instanceof
检查是否可以进行强制转换:

if(field.getType() instanceof Number)
   field.getType().cast(Number.class);

isAssignableFrom(type)提供给您的内容与反射提供给您的内容之间存在差异:isAssignableFrom检查直接类型分配兼容性,而反射隐式地对原语执行装箱/取消装箱。你必须明确地解释这种差异。一种方法是在集合中表示兼容的原语,并接受集合中包含的任何类型以及数字分配兼容的类型:

private final static Set<Class<?>> NUMBER_REFLECTED_PRIMITIVES;
static {
    Set<Class<?>> s = new HashSet<>();
    s.add(byte.class);
    s.add(short.class);
    s.add(int.class);
    s.add(long.class);
    s.add(float.class);
    s.add(double.class);
    NUMBER_REFLECTED_PRIMITIVES = s;
}

public static boolean isReflectedAsNumber(Class<?> type) {
    return Number.class.isAssignableFrom(type) || NUMBER_REFLECTED_PRIMITIVES.contains(type);
}
private final static Set>s=new HashSet();
s、 add(byte.class);
s、 添加(短类);
s、 添加(内部类);
s、 添加(长类);
s、 添加(float.class);
s、 增加(双级);
反射的基本体数=s;
}
公共静态布尔值isReflectedAsNumber(类类型){
返回Number.class.isAssignableFrom(type)| | Number_反射的_原语.contains(type);
}

请注意,您可能会遇到满足条件的意外类型,例如BigDecimal、AtomicLong等。它们是数字的子类型。

您可能正在寻找以下类型:

private static final Set<Class<?>> primitiveNumbers = Stream
        .of(int.class, long.class, float.class, 
            double.class, byte.class, short.class)
        .collect(Collectors.toSet());

private static boolean isNumericType(Class<?> cls) {
    if (cls.isPrimitive()) {
        return primitiveNumbers.contains(cls);
    } else {
        return Number.class.isAssignableFrom(cls);
    }
}
演示:


返回false if字段longtry if(Number.class.isAssignableFrom(field.getType()))。并阅读java文档以了解此方法的更多详细信息。@zombie此答案已经存在,并且它是错误的
if(field.getType() instanceof Number)
   field.getType().cast(Number.class);
private final static Set<Class<?>> NUMBER_REFLECTED_PRIMITIVES;
static {
    Set<Class<?>> s = new HashSet<>();
    s.add(byte.class);
    s.add(short.class);
    s.add(int.class);
    s.add(long.class);
    s.add(float.class);
    s.add(double.class);
    NUMBER_REFLECTED_PRIMITIVES = s;
}

public static boolean isReflectedAsNumber(Class<?> type) {
    return Number.class.isAssignableFrom(type) || NUMBER_REFLECTED_PRIMITIVES.contains(type);
}
private static final Set<Class<?>> primitiveNumbers = Stream
        .of(int.class, long.class, float.class, 
            double.class, byte.class, short.class)
        .collect(Collectors.toSet());

private static boolean isNumericType(Class<?> cls) {
    if (cls.isPrimitive()) {
        return primitiveNumbers.contains(cls);
    } else {
        return Number.class.isAssignableFrom(cls);
    }
}
private static boolean holdsNumericType(Field f) {
    return isNumericType(f.getType());
}
System.out.println(isNumericType(int.class));       //true
System.out.println(isNumericType(Integer.class));   //true
System.out.println(isNumericType(byte.class));      //true
System.out.println(isNumericType(Byte.class));      //true
System.out.println(isNumericType(Character.class)); //false
System.out.println(isNumericType(Boolean.class));   //false