【问题标题】:Check type of primitive field检查原始字段的类型
【发布时间】:2009-12-11 23:43:48
【问题描述】:

我正在尝试确定对象上字段的类型。我不知道传递给我的对象的类型,但我需要找到longs 的字段。区分盒装的Longs 很容易,但基本的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
    }
}

似乎可行的一种hacky方法是:

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

如果有的话,我真的很想要一种更清洁的方法来做到这一点。如果没有更好的方法,那么我认为要求我收到的对象只使用Long(而不是long)会是一个更好的API。

有什么想法吗?

【问题讨论】:

    标签: java reflection primitive


    【解决方案1】:

    您使用错误的常量来检查 Long 原语 - 使用 Long.TYPE,可以在包装器上使用类似命名的常量找到其他原语类型。例如:Byte.TYPE、Character.TYPE等

    【讨论】:

      【解决方案2】:
      o.getClass().getField("fieldName").getType().isPrimitive();
      

      【讨论】:

      • 是的,我看过了,但我需要知道它是否是一个长原语,而不仅仅是它是否是一个原语。即匹配所有长原语,但不匹配整数或字节等。
      【解决方案3】:

      你可以使用

      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.class。我没有时间测试它,但我认为您的其余评论不适用于我的特定情况(如果我错了,请纠正我。如果我这样做: Class> returnType = m.getReturnType() ; if (returnType.equals(Long.class)) { // do stuff } 我不认为它会起作用 - 我仍然需要检查 long.class 或 Long.TYPE。如果我可以调用 all get ...() 方法,然后我可以检查返回的内容(但我不能这样做)。如果我误解了,请告诉我(可能...)。
      • 我希望你能读懂...我忘记了格式不会出来。 :(
      • 试试; if (returnType == Long.class || returnType == long.class)
      • 和我一样。而且,我读到你的帖子给出了两个单独的答案,第一个(大部分)用英语,第二个(大部分)用代码。底部的实际上并没有检查类型是否与 OP 需要的特定类型匹配。如果没有,它将失败。 (我假设 OP 事先不知道哪些字段具有所需的类型。)
      • 感谢您接受我的挑剔!
      【解决方案4】:
      • 要检测具有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
          }
      }
      

      通知:

      Long.TYPE 是静态常量成员,等价于long.class。

      sn-p代码形式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 问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        相关资源
        最近更新 更多