Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射迭代类成员_Java_Reflection - Fatal编程技术网

Java 使用反射迭代类成员

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(

我有一个类,有许多不同类型的参数。我希望迭代所有类型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();
        }
    }

谢谢

您似乎没有为循环中强制转换到
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);
    
  • 几点提示:

  • 比较类是否相等,而不是它们的名称

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

  • 或者更好的方法是,使用
    isAssignableFrom(java.lang.Class)
    来处理这样的情况,即类将返回类型声明为您要查找的子类

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

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

    this.getClass().getDeclaredMethods()


  • 你需要提供更多关于你想要什么以及为什么。。。示例代码和描述不够清晰。你的第一条评论完全正确,我已经编辑了这篇文章。谢谢你能详细解释一下为什么我不应该使用反射吗?谢谢您失去了编译时的安全性,它会慢一点,通常您应该使用接口而不是反射来确保事情的存在。编译时安全性是Java的一大优点(对某些人来说也是缺点之一)。你能详细说明一下为什么要使用反射吗?ToBubear说了些什么,另外:更多的代码和代码更容易出错,更难理解。反射和(移动代码)安全性也不能很好地结合。
    XPathDataElement tmp = (XPathDataElement) field.get(this);