检查原始字段的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.TYPECharacter.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(); 
  • 要检测longtypes的字段,请使用long.classLong.TYPE

  • Longtypes检测字段使用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问题之间的差异