检查原始字段的types
我试图确定一个对象的字段的types。 当它传递给我的时候,我不知道这个对象的types,但是我需要find很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。
有任何想法吗?
您正在使用错误的常量来检查Long原语 – 使用Long.TYPE
,可以在包装器上find具有相似名称常量的其他原始types。 例如: 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方法总是使用对象,因此您不需要知道该字段是否为基本types(除非您尝试将基本types设置为空值)。
实际上,对于get()方法,您不需要知道它是哪种types。 你可以做
// any number type is fine. Number n = field.get(object); long l = n.longValue();
如果您不确定是否可以使用数字types
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
types的字段,请使用long.class
或Long.TYPE
。 -
用
Long
types检测字段使用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
。
片段代码formsLong
类
/** * The {@link Class} object that represents the primitive type {@code long}. */ @SuppressWarnings("unchecked") public static final Class<Long> TYPE = (Class<Long>) long[].class.getComponentType();
还要检查Integer.class和Integer.TYPE问题之间的差异