我正在尝试确定对象上字段的类型。传递给我时,我不知道对象的类型,但我需要查找long
个字段。很容易区分盒装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。
有什么想法吗?
答案 0 :(得分:63)
您正在使用错误的常量来检查Long基元 - 使用Long.TYPE
,可以在包装器上找到具有类似命名常量的其他基本类型。例如:Byte.TYPE
,Character.TYPE
等
答案 1 :(得分:45)
o.getClass().getField("fieldName").getType().isPrimitive();
答案 2 :(得分:16)
你可以使用
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();
答案 3 :(得分: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问题的Difference between Integer.class and Integer.TYPE