Java 如何使用泛型函数存储类中每个变量的值?

Java 如何使用泛型函数存储类中每个变量的值?,java,reflection,field,Java,Reflection,Field,我试图将类中每个变量的所有值存储到ArrayList中。 我已经在我所有的类中创建了这个函数,我希望它对每个类都做相同的操作(每个类都有不同的变量) 换句话说,我想@重写toString函数,但不知道该类有多少属性 这就是我到目前为止所做的: public class Example { private type1 var1 = 'Hello'; private type2 var2 = 10; private type3 var3 = 'Bye'; //...

我试图将类中每个变量的所有值存储到
ArrayList
中。 我已经在我所有的类中创建了这个函数,我希望它对每个类都做相同的操作(每个类都有不同的变量)

换句话说,我想
@重写
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);
     }
}
但我想要的结果是:

Hello, 10, Bye

有没有办法做到这一点?

您可以通过以下方式获得字段的值:

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);
    }
}
公共类示例{
私有int var1;
私有字符串var2;
私人双var3;
公共示例(int-var1、String-var2、double-var3){
this.var1=var1;
this.var2=var2;
this.var3=var3;
}
@凌驾
公共字符串toString(){
ArrayList字段=新的ArrayList();
试一试{
对于(字段f:this.getClass().getDeclaredFields()){
add(f.get(this.toString());
}
}
捕获(非法访问例外e){
返回“生成toString时非法访问”;
}
返回字符串。join(“,”字段);
}
}
它应该可以很好地处理基元类型。但是,如果您想管理复杂类型,它当然会变得非常混乱(无论如何,当您使用反射时,从一开始就有点混乱)。
我真的不知道您想要实现什么,但请确保反射是您唯一的选择,并再次检查您是否正在重新设计轮子。

您是否希望,函数的名称可能会有所不同。.哪个函数?示例中的函数但是
getName()
不返回字段的类型,它返回名称。因此
getName()
。该类型由(出乎意料地)
getType()
返回。所以,不,你的代码没有你声称的那样。谢谢!成功了。如果字符串值为
null
,它仍然可以工作吗?我遇到一些问题,调试时发现
null
值可能会导致一些错误。
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);
    }
}