如何使用反射比较类?

时间:2009-05-05 16:09:27

标签: java reflection

我正在尝试使用反射来确定类的类类型,然后执行特定的操作。例如,如果类是double,则使用双特定方法。

我正在尝试使用


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

但是,我收到编译错误:

“不兼容的操作数类型Class< capture#1-of?extends Field> and Class< Double>”

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

编辑:更清楚

f属于Field类型。通过循环反射获得


  (Field f : instance.getDeclaredFields())

5 个答案:

答案 0 :(得分:7)

有趣的错误消息(我不知道'=='运算符会检查那些)。 但基于它,我怀疑你的比较是错误的:你试图看看Field类(理论上它的超类,但仅在理论上 - Field是final)与Double.class相同,它不能是

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

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

代替。鉴于Double是最后一堂课,那应该有用。否则“isAssignableFrom”会更合适。

答案 1 :(得分:3)

如果您有对象,请使用

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);
}

..这很好用

答案 2 :(得分:1)

最简单的方法是

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

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

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

答案 3 :(得分:1)

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

代码如下所示:


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

答案 4 :(得分:0)

以下代码段应该可以正常运行:

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

BTW,根据我的测试(JRE7),==equals都不适用于数字类型