Java 检查基本字段的类型

Java 检查基本字段的类型,java,reflection,primitive,Java,Reflection,Primitive,我试图确定对象上字段的类型。我不知道传递给我的对象的类型,但我需要找到长的字段。区分装箱的Longs很容易,但基本Long似乎更难 我可以确保传递给我的对象只有long,而不是原语,但我宁愿不要。因此,我得到的是: for (Field f : o.getClass().getDeclaredFields()) { Class<?> clazz = f.getType(); if (clazz.equals(Long.class)) { // foun

我试图确定对象上字段的类型。我不知道传递给我的对象的类型,但我需要找到
长的字段。区分装箱的
Long
s很容易,但基本
Long
似乎更难

我可以确保传递给我的对象只有
long
,而不是原语,但我宁愿不要。因此,我得到的是:

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(字段f:o.getClass().getDeclaredFields()){
类clazz=f.getType();
if(clazz.equals(Long.class)){
//找到了一个--我来这里不是很久以前的事了
}
}
一种似乎有效的方法是:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}
for(字段f:o.getClass().getDeclaredFields()){
类clazz=f.getType();
if(clazz.equals(Long.class)| | clazz.getName().equals(“Long”)){
//找到一个
}
}
我真的希望有一个更干净的方法来做这件事。如果没有更好的方法,那么我认为要求我接收的对象只使用
Long
(而不是
Long
)将是更好的API


有什么想法吗?

您使用了错误的常量来检查长原语-使用
Long.TYPE
,可以在包装器上找到其他具有类似命名常量的原语类型。例如:
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方法始终使用对象,因此不需要知道字段是否为基元类型(除非尝试将基元类型设置为null值)

实际上,对于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();
  • 要检测具有
    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
    }
}

也检查问题

是的,我看了,但我需要知道它是否是一个长基元,而不仅仅是它是否是一个基元。i、 匹配所有长原语,但不匹配整数或字节等。谢谢,我也不知道long.class。我没有时间测试它,但我认为您的其余评论不适用于我的特殊情况(如果我错了,请纠正我。如果我这样做:Class returnType=m.getReturnType();if(returnType.equals(Long.Class)){//do stuff}我认为它不会起作用-我仍然需要检查long.class或long.TYPE。如果我可以调用所有get…()方法,那么我可以检查返回的内容(但我不能这样做)。请告诉我我是否误解了(可能是…)。我希望你能读到…我忘了格式不会出来。:(尝试;如果)(returnType==Long.class | | returnType==Long.class)和我一样。而且,我读到你的帖子时给出了两个单独的答案,第一个(大部分)用英语回答,第二个(大部分)用代码回答。最下面的一个没有检查类型是否与OP需要的特定类型匹配。如果不匹配,它将失败。(我假设OP事先不知道哪些字段具有所需的类型。)感谢您接受我的挑剔!
/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();