【问题标题】:How to store the values of each variable of a class using a generic function?如何使用泛型函数存储类的每个变量的值?
【发布时间】:2020-03-26 08:06:43
【问题描述】:

我正在尝试将类的每个变量的所有值存储到 ArrayList 中。 我已经在我拥有的所有类中创建了这个函数,我希望它对每个类都做同样的事情(每个类都有不同的变量)。

换句话说,我想@Override toString 函数但不知道该类有多少属性。

这是我到目前为止所做的:

public class Example {

    private type1 var1 = 'Hello';
    private type2 var2 = 10;
    private type3 var3 = 'Bye';
    //...

    @Override
    public String toString() {
        ArrayList<String> fields = new ArrayList<>();

        for (Field f: this.getClass().getDeclaredFields()) {

            fields.add(f.getName());    //This does not work for what I want. This returns the name of the type of the variable and not what it is storing. What should I change it for?
        }

         return String.join(", ", fields);
     }
}

所以,对于这个例子,我得到的输出是:

var1, var2, var3

但我想要的输出是:

Hello, 10, Bye

有没有办法做到这一点?

【问题讨论】:

  • 不是真的,该函数可能有不同的命名
  • ..哪个函数?
  • 示例中的函数
  • 但是getName() 不返回字段的类型,而是返回名称。因此getName()。该类型由(令人惊讶的)getType() 返回。所以不,你的代码没有做你声称的事情。

标签: java reflection field


【解决方案1】:

您可以通过这种方式获取字段的值:

public class Example {

    private int var1;
    private String var2;
    private double var3;

    public Example(int var1, String var2, double var3) {
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;
    }

    @Override
    public String toString() {
        ArrayList<String> fields = new ArrayList<>();

        try {
            for (Field f: this.getClass().getDeclaredFields()) {
                fields.add(f.get(this).toString());
            }
        }
        catch(IllegalAccessException e) {
            return "Illegal access while generating toString";
        }

        return String.join(", ", fields);
    }
}

它应该适用于原始类型。但是,如果您想管理复杂类型,它当然会变得非常混乱(无论如何,当您使用反射时,从一开始就有点混乱)。 我真的不知道您想要实现什么,但请确保反思是您唯一的选择,并仔细检查您没有重新发明轮子。

【讨论】:

  • 谢谢!有效。如果字符串值为null,它仍然可以工作吗?我遇到了一些问题,调试时发现null 值可能会导致一些错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多