检查原始字段的类型

mac*_*tch 40 java reflection primitive

我正在尝试确定对象上字段的类型.当它传递给我时,我不知道对象的类型,但我需要找到longs的字段.很容易区分盒装,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
    }
}
Run Code Online (Sandbox Code Playgroud)

一种似乎有用的hacky方式是:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有的话,我真的想要一个更干净的方法.如果没有更好的方法,那么我认为要求我收到的对象只使用Long(不是long)将是一个更好的API.

有任何想法吗?

mP.*_*mP. 67

您正在使用错误的常量来检查Long基元 - 使用Long.TYPE,可以在包装器上找到具有类似命名常量的其他基本类型.如:Byte.TYPE,Character.TYPE等等.


Dro*_*roo 50

o.getClass().getField("fieldName").getType().isPrimitive();
Run Code Online (Sandbox Code Playgroud)


Pet*_*rey 16

你可以使用

boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class
Run Code Online (Sandbox Code Playgroud)

如果您正在使用反射,为什么要关心,为什么要进行此检查.get/set方法总是使用对象,因此您不需要知道该字段是否是基本类型(除非您尝试将基本类型设置为空值.)

实际上,对于方法get(),您不需要知道它是哪种类型.你可以做

// any number type is fine.
Number n = field.get(object);
long l = n.longValue();
Run Code Online (Sandbox Code Playgroud)

如果您不确定它是否为数字类型,则可以执行此操作

Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
     Number n = (Number) o;
     long l = n.longValue();
Run Code Online (Sandbox Code Playgroud)

  • 和我一样.而且,我读到你的帖子给出了两个单独的答案,第一个(大部分)是英语,第二个(大部分)是代码.底部实际上并不检查类型是否与OP所需的特定类型相匹配.如果没有,它将失败.(我假设OP事先不知道哪个字段具有所需的类型.) (2认同)

ahm*_*mdy 5

  • 要检测long类型为long.class或的字段Long.TYPE

  • 要使用Longtype 来检测字段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
    }
}
Run Code Online (Sandbox Code Playgroud)

注意事项

Long.TYPE是静态的常量成员,并且等效于long.class

代码段形式LongClass

/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();
Run Code Online (Sandbox Code Playgroud)

还要检查Integer.class和Integer.TYPE问题之间区别的答案