Java 使用反射迭代类成员
我有一个类,有许多不同类型的参数。我希望迭代所有类型A成员,并运行特定函数(A.doSomething()) 这甚至不会编译:从字段到XPathDataElement的转换是非法的Java 使用反射迭代类成员,java,reflection,Java,Reflection,我有一个类,有许多不同类型的参数。我希望迭代所有类型A成员,并运行特定函数(A.doSomething()) 这甚至不会编译:从字段到XPathDataElement的转换是非法的 Field[] fields = this.getClass().getDeclaredFields(); for (Field field : fields) { if (field. getType().getName().equals(XPathDataElement.class.getName(
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();
}
}
谢谢 您似乎没有为循环中强制转换到
XPathDataElement
的obj
分配任何内容
您可能希望执行以下操作:
tmp = (XPathDataElement)field.get(this);
我强烈建议避免反思,除非你真的需要 只需写出代码:
this.x.doSomething();
this.y.doSomething();
this.z.doSomething();
或者,如果您愿意:
for (A a : new A[] {
this.x, this.y, this.z
}) {
a.doSomething();
}
如果你不说代码出了什么问题,就很难调试代码 我可以看到两件事:
if (field.getType().equals(XPathDataElement.class))
应该有用
编辑:Steve Reed,您不一定需要它完全是XPathDataElement
;子类也可以工作。要检查该字段是否可以被视为XPathDataElement
,应使用
这就是密码get()
的对象是要检索其字段的对象;如果您正在操作此(这是一种强烈的代码气味),那么您的代码将是
XPathDataElement tmp = (XPathDataElement) field.get(this);
isAssignableFrom(java.lang.Class)
来处理这样的情况,即类将返回类型声明为您要查找的子类
XPathDataElement.class.isAssignableFrom(field.getType())你需要提供更多关于你想要什么以及为什么。。。示例代码和描述不够清晰。你的第一条评论完全正确,我已经编辑了这篇文章。谢谢你能详细解释一下为什么我不应该使用反射吗?谢谢您失去了编译时的安全性,它会慢一点,通常您应该使用接口而不是反射来确保事情的存在。编译时安全性是Java的一大优点(对某些人来说也是缺点之一)。你能详细说明一下为什么要使用反射吗?ToBubear说了些什么,另外:更多的代码和代码更容易出错,更难理解。反射和(移动代码)安全性也不能很好地结合。
XPathDataElement tmp = (XPathDataElement) field.get(this);