1

私は、デバッグ用にJavaクラスを出力する堅牢なコードを作成しようとしています。そのために、私は反射を使用します。「ブール値には静的な最終ブール値TRUEが含まれています」などの再帰的定義から保護するために、親に等しいフィールドは無視します。私は怠惰から文字列+=を使用します。効率的である必要はありません。

それでも、反射を伴うオブジェクトの再帰的な記述を行うためのより良い方法はありますか?

public String reflectionShowFields(Object parentObject) {
    String stringData = "";

    for (Field field:parentObject.getClass().getFields()) {
        try {
            Class<?> type = field.getType();
            String typeSimpleName = type.getSimpleName();
            Object fieldValue = field.get(parentObject);
            String fieldName = field.getName();
            if (type.isPrimitive() || type.isEnum() || CharSequence.class.isAssignableFrom(type)) {
                stringData += String.format("%s: %s\n", fieldName, fieldValue);
            } else if (Iterable.class.isAssignableFrom(type)) {
                stringData += String.format(">>> %s[%s]: \n", fieldName, typeSimpleName);
                for (Object item:(Iterable)fieldValue) {
                    stringData += reflectionShowFields(item);
                }
                stringData += String.format("<<< %s[%s]: \n", fieldName, typeSimpleName);
            } else if (!fieldValue.equals(parentObject)) {
                stringData += String.format(">>> %s[%s]: %s \n--------\n", fieldName, typeSimpleName, fieldValue.toString());
                stringData+= reflectionShowFields(fieldValue);
                stringData += String.format("<<< %s[%s]: \n", fieldName, typeSimpleName);
            }
        } catch (IllegalAccessException ignored) {}
    }
    return stringData;
}
4

2 に答える 2

4

Apache commons-langReflectionToStringBuilderhttps://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ReflectionToStringBuilder.htmlを使用できます

于 2013-02-19T15:48:49.570 に答える
2

これはうまくいかないと思います。

  • 「親と等しい」フィールドを無視しても機能しません。Aを参照しているを参照しているB場合はどうなりますかA

  • サイクルと、DAG内の共有ノードについて知りたい

  • canを繰り返すと、Iterable副作用が発生したり、終了しない場合や、例外がスローされる場合があります。

  • 任意のグラフの読み取り可能なレンダリングを作成することは、非常に難しい可能性があります。

  • これは、手作りの方法よりも桁違いに遅くなりますtoString()

しかし、このように考えてください。これが良い考えであるならば、この種のことをした有名なサードパーティのライブラリがあるでしょう。そして、私たちは皆、すでにそれらを使用しているでしょう。サードパーティのライブラリがあることがわかりましたが、それらを注目度の高いものと呼ぶことはほとんどありません。


ちなみに、JAXBまたはJSONバインディングを使用して、POJOをテキストとしてレンダリングできます。それは同じ目的を達成します...


最後に、ブール型の静的フィールドを持つブールの例は適切ではありません。インスタンスを表示するときに静的フィールドをレンダリングすることは望ましくありません。

于 2013-02-19T15:58:17.807 に答える