user157629:
私はに保存しようとしている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
これを行う方法はありますか?
ジョセリン・ルコント:
あなたは、フィールドの値をこのように得ることができます。
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);
}
}
これは、プリミティブ型とうまく動作するはずです。あなたは複雑なタイプを管理したい場合はしかし、もちろんそれは、(あなたはリフレクションを使用する場合、とにかく、それはちょっと最初から乱雑です)本当に厄介取得することができます。私は本当にあなたが達成したいものを知っているが、反射があなたが車輪の再発明していないことを、あなたの唯一のオプションとのダブルチェックであることを確認していません。