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