检查原始字段的类型

时间:2009-12-11 23:43:49

标签: java reflection primitive

我正在尝试确定对象上字段的类型。传递给我时,我不知道对象的类型,但我需要查找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。

有什么想法吗?

4 个答案:

答案 0 :(得分:63)

您正在使用错误的常量来检查Long基元 - 使用Long.TYPE,可以在包装器上找到具有类似命名常量的其他基本类型。例如:Byte.TYPECharacter.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.classLong.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