java - 遍历Java中的成员变量

标签 java oop variables iterator hashmap

我有几种情况,其中一个类由任意(但固定)数量的不同类型的变量组成,我希望遍历这些变量并在代码中使用它们的名称。有没有比在每个函数中重新键入每个变量名更聪明的方法呢?

我最初的想法是使用 HashMap 来存储局部变量,但这似乎效率低下并且无法处理多种类型。

模拟以下代码以缩短所需的阅读时间,但通常超过 3 个变量:

class Widget implements Parcelable {
    String name, code;
    Long price;

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(code);
        dest.writeLong(price);
    }

    public Widget(Parcel o) {
        name = o.name;
        code = o.code;
        price = o.price;
    }

    public String getXML() {
        return "<Widget><name>"+name+"</name><code>"+code
              +"</code><price>"+price+"</price></Widget>";
    }
}

相反,我更愿意做类似(伪代码)的事情:

public Widget(Parcel o) {
    for (Map<Name,Data> item: o.getMap()) {
        this.setValue(Name, Data);
    }
}
public String getXML() {
    StringBuilder XML = new StringBuilder();
    XML.append("<Widget>");
    for (Map<Name,Data> item: o.getMap()) {
        XML.append("<"+Name+">" + Data + "</"+Name+">");
    }
    XML.append("</Widget>");
    return XML.toString();
}

我一直认为必须有一种模式来做这类事情,但也许这只是我的 Python 历史影响了我的 Java 经验。

更新:这不仅仅是从成员变量中获取 XML,而是关于在多个成员函数中循环遍历成员变量。看来 Java 的反射功能在我的保留轨道中缺失了。

我的新的较小的构造函数让我很高兴学到了一些有用的东西,看起来像:

public Widget(Widget other) {
    for (Field f : getClass().getDeclaredFields()) {
        if (f.getName() == "TAG") {
            continue;
        }
        f.set(this, f.get(other));
    }
}

最佳答案

这通常可以通过反射来解决:

for (Field f : getClass().getDeclaredFields()) {
    String name = f.getName();
    String value = f.get(this);
}

但是,要写入/读取 XML,您可能需要使用 JAXB而不是重新发明轮子。

关于java - 遍历Java中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633996/

相关文章:

java - 在 Hibernate/JPA 映射中自动为列名添加特定于表的前缀?

java - Jenkins ,指定 JAVA_HOME

java - 真的需要通配符泛型吗?

java - 构造函数和构造函数重载

javascript - CoffeeScript:对象初始化器中的 Getter/Setter

java - 为什么 Java 中的 Switch 语句可以包含 FINAL 变量作为 CASE?

javascript - onclick 输出变量

string - PowerShell 使用字符串中的变量作为参数传递

java - 随机 java.util.ConcurrentModificationException : null

Python:OOP 开销?