我有一个包含各种类型参数的类。我想迭代所有类型的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();
}
}
谢谢!
答案 0 :(得分:10)
当你没有说出它的错误时,很难调试你的代码。
我能看到两件事:
没有必要比较字符串来判断字段的类型是否是正确的类。
if (field.getType().equals(XPathDataElement.class))
应该有用。
编辑:史蒂夫·里德points out,你并不一定非常需要它XPathDataElement
;子类也可以正常工作。要检查该字段是否可以视为XPathDataElement
,您应该使用Class.isAssignableFrom(Class)
。
if (XPathDataElement.class.isAssignableFrom(field.getType()))
将是代码。
我猜你真正的问题是如何反思地得到一个字段的价值?如果是这样,那么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)
有几点指示:
比较类的相等性,而不是它们的名称。
field.getType()。等于(XPathDataElement.class)
或者更好的是,使用isAssignableFrom(java.lang.Class)
来处理类声明返回类型作为您要查找的子类的情况
XPathDataElement.class.isAssignableFrom(field.getType())
您正在迭代字段,而不是方法。你的问题让我假设你想要后者,如果是,请使用:
this.getClass()。getDeclaredMethods()
答案 3 :(得分:0)
您似乎没有向循环中投放到obj
的{{1}}分配任何内容。
你可能想做这样的事情:
XPathDataElement