使用反射来迭代类成员

时间:2009-04-06 14:04:51

标签: java reflection

我有一个包含各种类型参数的类。我想迭代所有类型的A成员,并运行特定的函数(A.doSomething())

这甚至无法编译:从字段到XPathDataElement的转换是非法的

Field[] fields = this.getClass().getDeclaredFields();
  for (Field field : fields) {
     if (field. getType().getName().equals(XPathDataElement.class.getName()))
        {               
                tmp = (XPathDataElement)field; // Doesn't compile
                sb.append(field.getName() + ":"); 
                tmp.update();
        }
    }

谢谢!

4 个答案:

答案 0 :(得分:10)

当你没有说出它的错误时,很难调试你的代码。

我能看到两件事:

  1. 没有必要比较字符串来判断字段的类型是否是正确的类。

    if (field.getType().equals(XPathDataElement.class))
    

    应该有用。

    编辑:史蒂夫·里德points out,你并不一定非常需要它XPathDataElement;子类也可以正常工作。要检查该字段是否可以视为XPathDataElement,您应该使用Class.isAssignableFrom(Class)

    if (XPathDataElement.class.isAssignableFrom(field.getType()))
    

    将是代码。

  2. 我猜你真正的问题是如何反思地得到一个字段的价值?如果是这样,那么Field.get(Object)就是你想要的。传递给get()的对象是您要检索其字段的对象;如果你在this上运行(这是强烈的代码味道),那么你的代码就是

    XPathDataElement tmp = (XPathDataElement) field.get(this);
    

答案 1 :(得分:2)

我强烈建议避免反思,除非你真的需要它。

只需编写代码:

this.x.doSomething();
this.y.doSomething();
this.z.doSomething();

或者如果您愿意:

for (A a : new A[] {
    this.x, this.y, this.z
}) {
    a.doSomething();
}

答案 2 :(得分:1)

有几点指示:

  1. 比较类的相等性,而不是它们的名称。

    field.getType()。等于(XPathDataElement.class)

  2. 或者更好的是,使用isAssignableFrom(java.lang.Class)来处理类声明返回类型作为您要查找的子类的情况

    XPathDataElement.class.isAssignableFrom(field.getType())

  3. 您正在迭代字段,而不是方法。你的问题让我假设你想要后者,如果是,请使用:

    this.getClass()。getDeclaredMethods()

答案 3 :(得分:0)

您似乎没有向循环中投放到obj的{​​{1}}分配任何内容。

你可能想做这样的事情:

XPathDataElement