カスタムクラスオブジェクトを人間が読める文字列に自動的に変換する方法はありますか?
たとえば、次のクラスを検討してください。
class Person {
String Name;
int Salary;
...
}
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);
私は次のようなものを入手する必要があります:
Person: Name="Tony", Salary=1000
ToStringBuilderを使用できるCommons Langのインポート
メソッドreflectionToString(java.lang.Object)
を確認してください。これにより、期待する表現が自動的に作成されます。
このコード:
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);
System.out.println(ToStringBuilder.reflectionToString(p));
結果は次の文字列になります。
Person@64578ceb[Name=Tony,Salary=1000]
これが基本的なtoString
目的です。ただし、これを自動的に実行したい場合は、それを実行できる一般的なサービスを作成できます。リフレクションを使用してすべてのフィールドを反復処理してから、各フィールドの名前と値を出力します。それらの値を印刷する最も簡単な方法は、それらを使用することですが、場合によってtoString
は、それらをその印刷サービスに再帰的に渡すこともできます(もちろん、停止条件を見つける必要があります)。
たとえば、一部のクラスでは、PrintUtilsには次のものがあります。
public static void printFields(Object o) {
System.out.print(o.getClass.getSimpleName() + ": ");
for (Field field : o.getClass().getDeclaredFields()) {
field.setAccessible(true); // you also get non-public fields
System.out.print(field.getName() + " = " + field.get(o) + ", ");
}
}
もちろん、例外などを処理し、出力をより適切にフォーマットする必要があります。また、これは現在のクラスで宣言されたフィールドのみを出力します。継承階層の上位でフィールドを宣言する場合は、もう少し作業する必要があります。最後に、リフレクションの使用は、通常のを使用するよりもはるかに遅くなりますtoString
。使用toString
可能であれば、それが望ましいです。
toString
クラスのメソッドをオーバーライドできることを確認してください。
次のように:
class Person {
String name;
int salary;
...
@Override public String toString() {
return "Person: Name='" + name + "', Salary=" + salary;
}
}
詳細については、 https://blogs.oracle.com/CoreJavaTechTips/entry/writing_tostring_methods_tech_daysを参照してください。
の一部であるToStringBuilderを使用できると思いますcommons-lang
。
それを行う 1 つの方法は、Apache Commons BeanUtils.describeに依存することです。これによりMap
、Bean のプロパティの が生成され、 を介して適切に文字列に変換されますMap.toString
。よりカスタムなものが必要な場合は、リフレクション API を掘り下げる必要があります。
Java からメッセージ形式を使用できます: https://docs.oracle.com/javase/tutorial/i18n//message.html 別の変数 by - そしてそこにあなたのクラスの人間が読める文字列があります!
class Person {
String Name;
int Salary;
...
@Override
public String toString() {
return "Person: Name = " + Name + "," +
"Salary="+Salary;
}
}
Person p = new Person();
p.setName("Tony");
p.setSalary(1000);
System.out.println(p.toString());