【问题标题】:How do I compare classes using reflection?如何使用反射比较类?
【发布时间】:2009-05-05 16:09:27
【问题描述】:

我正在尝试使用反射来确定类的类类型,然后做一些具体的事情。例如,如果类是双精度类,则使用双精度特定方法。

我正在尝试使用


  if(f.getClass() == Double.class)

但是,我收到编译器错误:

“不兼容的操作数类型 Class 和 Class

这样做的正确方法是什么?

编辑:更清楚

f 是字段类型。通过循环反射获得


  (Field f : instance.getDeclaredFields())

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    有趣的错误信息(我不知道 '==' 操作员会检查这些)。 但基于此,我怀疑您的比较是错误的:您试图查看 Field 类(理论上它的超类,但仅在理论上——Field 是最终的)是否与 Double.class 相同,它不可能是.

    所以:是的,如果你给出正确的论点,比较应该有效。所以我怀疑你想这样做:

    if (f.getType() == Double.class)

    相反。这应该可行,因为 Double 是最后一课。否则“isAssignableFrom”会更合适。

    【讨论】:

      【解决方案2】:

      如果你有对象,那么使用

      if (f instanceof Double) { }
      

      另一个有趣的事情是方法 isAssignableFrom:

      if (f.getClass().isAssignableFrom (Double.class)) { }
      

      但总的来说,这是一种糟糕的风格。使用多态性来实现依赖于类类型的逻辑。


      评论答案:f instanceof Double 工作正常。

      你可能写过这样的东西:

      float f = 1.1f;
      if (f instanceof Double) { ..}
      

      智能 java 编译器说你有 CE。但是:

      public static boolean isInstanceOfDouble (Object obj) {
         return obj instanceof Double;
      }
      
      psvm (String [] args) {
         sout (isInstanceOfDouble (1.1f);
      }
      

      ..这很好用

      【讨论】:

      • 这并不总是一回事。如果 Double 不是最终类,那么如果 f 恰好是子类,两者就会不同。
      • 是的,如您所见,我写了“有趣”,意思是“阅读 javadocs 了解更多详细信息”。无论如何,我更喜欢 OOP 解决方案
      • 嘿,“psvm”和“sout”实时模板 +1。要是有人会用代码完成构建一个文本框控件就好了……
      • You isInstanceOfDouble() 示例由于自动装箱而工作正常,并且非常做作。为什么我要查看原始类型是否是任何对象的实例,而根据定义它不是? (它的包装可能是但那不一样)。
      【解决方案3】:

      您应该使用 getType() 来获取基础类型,而不是获取类。 getType() 根据需要返回底层类型的类。

      代码如下所示:

      
        if(f.getType().equals(Double.class))
      

      【讨论】:

      • 这是一个完全不同的问题的答案。 getType() 特定于 Field 类,而 getClass() 适用于所有对象。
      • 但是您是否注意到我和 Roman 都给出了没有意义的答案?我们都在回答你原来的问题。 (我已经更新了我的答案来解释这里的真正问题。)
      • 我承认第一个问题可能没有应有的清晰,但是我在问题和解释问题的帖子中都明确提到了反思。此外,我不明白为什么我的答案被否决了,因为它清楚地回答了我的问题......
      【解决方案4】:

      最简单的方法是

      if (f.getClass().equals(Double.class))
      

      编辑:啊,现在我看到了问题所在。你得到的错误是因为(由于泛型)编译器可以告诉类永远不会相等(Field.class 不能等于Double.class)。使用 .equals() 会将其变为警告而不是错误,但它仍然是错误代码。

      Field.getType() 为您提供字段的类型。由于在编译时无法知道这一点,因此如果您像原来一样使用== 运算符,则不会出现错误。

      【讨论】:

      • 这不是我想要的方式。感谢您的帮助,我偶然发现了答案并发布了它。
      【解决方案5】:

      以下代码 sn-p 应该可以完美运行:

      if (f.getType() == Double.TYPE)
      

      顺便说一句,根据我的测试 (JRE7),==equals 都不适用于 Number 类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多