8

カスタムクラスオブジェクトを人間が読める文字列に自動的に変換する方法はありますか?

たとえば、次のクラスを検討してください。

class Person {
    String Name;
    int Salary;
    ...
}

Person p = new Person();
p.setName("Tony");
p.setSalary(1000);

私は次のようなものを入手する必要があります:

Person: Name="Tony", Salary=1000
4

7 に答える 7

11

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]
于 2012-07-02T10:40:27.253 に答える
3

これが基本的な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可能であれば、それが望ましいです。

于 2012-07-02T10:21:58.337 に答える
2

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を参照してください。

于 2012-07-02T10:21:08.183 に答える
2

の一部であるToStringBuilderを使用できると思いますcommons-lang

于 2012-07-02T10:40:50.943 に答える
0

それを行う 1 つの方法は、Apache Commons BeanUtils.describeに依存することです。これによりMap、Bean のプロパティの が生成され、 を介して適切に文字列に変換されますMap.toString。よりカスタムなものが必要な場合は、リフレクション API を掘り下げる必要があります。

于 2012-07-02T10:40:34.357 に答える
0

Java からメッセージ形式を使用できます: https://docs.oracle.com/javase/tutorial/i18n//message.html 別の変数 by - そしてそこにあなたのクラスの人間が読める文字列があります!

于 2015-10-16T07:33:29.650 に答える
-1
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());
于 2012-07-02T10:34:20.413 に答える