8

Webアプリケーションに多数のJavaBeanクラスがあり、toString()これらのBeanにメソッドを実装する簡単な方法を見つけようとしています。このtoString()メソッドは、アプリケーション全体のロギングに使用され、Bean内のすべての属性の属性と値のペアを出力する必要があります。

私は2つの選択肢を試しています:
1。BeanUtils.describe()(Apache commons-beanutils)
2. ReflectionToStringBuilder.toString()(Apache commons-lang)

これはトラフィックが多いと予想されるWebアプリケーションであるため、実装は軽量である必要があり、パフォーマンスに影響を与えないようにする必要があります。(メモリの使用、プロセッサの使用などが主な考慮事項です)。

上記の基準に従って、これらのどれがより良いパフォーマンスを発揮するか知りたいです。私の知る限り、リフレクションは大変な作業ですが、これら両方のオプションに関する詳細と洞察があれば、最適なソリューションを選択するのに役立ちます。

4

4 に答える 4

11

ToStringBuilder.reflectionToString()オブジェクトのtoString()メソッドで使用します。実稼働環境でこのように実行する際に問題は発生していません。確かに、このtoString()方法を使用することはめったにありません。

も使用BeanUtils.describe()しますが、別の目的で使用します。イントロスペクションを実行したBeanの内部キャッシュを保持するBeanUtilsuses 。PropertyUtilsBeanこれにより、他のソースよりもパフォーマンスが向上するように見えますが、reflectionToStringソースを少し調べてみると、最終的にはの実装に依存しているためjava.lang.Class、キャッシュもそこで機能するようです。

どちらも実行可能な選択肢のように見えBeanUtils.describe()ますが、reflectionToStringがフォーマットされた文字列を返すプロパティのマップを返します。出力で何をしたいかによると思います。

アプリケーションがオブジェクトの呼び出しに大きく依存している場合はtoString()、特定の実装がある方が有益な場合があることをお勧めします。

于 2011-04-14T00:05:43.437 に答える
10

個人的には、Eclipse / IntelliJを使用してtoString()メソッドを生成し、必要に応じて変更することを好みます(重要なフィールドのみを含めます)。

右クリック->ソース->toString()の生成。フィールドを選択します。終わり。

  1. Builderコードを書くよりも時間がかかりません。
  2. 実行速度が速くなります。
  3. permgenスペースを使用しません(反射はpermgenを食い尽くす傾向があります)

パフォーマンスが気になる場合は、これが私が進む道です。

于 2011-04-14T05:05:57.377 に答える
2

これは反射ベースなので、遅くなるので注意してください。

最近のWebプロジェクトでは、BaseエンティティのtoString()メソッドはToStringBuilder.reflectionToString(this)でした。

このメソッドは、保存中に休止状態で呼び出されます(Spring Data JPAリポジトリーを介して)。ネストされたリストを持つ非常に大きなオブジェクトツリーがあり、保存中にメモリとCPUのヒットが大きくなります。

それはほとんどプロジェクトを沈めました。

于 2014-07-04T11:08:11.087 に答える
-1

IDEでコードジェネレーターを使用してtoString()メソッドを生成するだけです。このようにして、反射を使用することによって発生するオーバーヘッドを回避できます。実際の本番システムでは、toString()メソッドが非常に頻繁に(100 /秒)呼び出され、ガベージコレクターがハードに動作してJVMを一時停止する可能性があります。これらの一時停止は、数秒または数十秒になる場合があります。

于 2011-10-27T00:41:00.137 に答える