5

リフレクション経由でプロパティにアクセスしたい Bean があります。プロパティ名を文字列形式で受け取ります。Bean には、プライベート フィールドの getter メソッドがあります。

現在、 を使用してフィールドを取得しgetDeclaredField(fieldName)、 を使用してアクセス可能にし、 を使用してsetAccessible(true)その値を取得していますget

もう 1 つの方法は、フィールド名を大文字にして先頭に追加getし、クラスからその名前でメソッドを取得し、最後にメソッドを呼び出してプライベート フィールドの値を取得することです。

どちらの方法が良いですか?

編集

おそらく、「より良い」とはどういう意味かを説明する必要があります...「より良い」とは、ベストプラクティスの意味で意味します。または、微妙な注意事項や違いがある場合。

4

4 に答える 4

2

Introspector公開されているプロパティのみを処理したい場合は、クラスを見てください。BeanInfoオブジェクトを取得してから呼び出すことができますgetPropertyDescriptors()。たとえば、次のようになります。

final BeanInfo info = Introspector.getBeanInfo(clazz);
for (PropertyDescriptor prop : info.getPropertyDescriptors()) {
    final Method read = prop.getReadMethod();
    if (read != null) {
        // do something
    }
}
于 2010-09-03T16:12:40.020 に答える
1

プロパティの値を返すだけでなく、追加の動作がある可能性があるため、getter メソッドを使用する可能性があります。ただし、これはクラスによって異なります。

于 2010-09-03T16:11:49.050 に答える
1

用途にもよりますが、一般的にはゲッターを使用することをお勧めします。これは「通常の」方法であり、より多くの場合、クラスの開発者が期待することを実行するためです。

原則として、クラスの開発者がフィールドを非公開にした場合、別の方法で計算できる場合は後で削除するなど、好きなように自由に実行できます。その後、運が悪いと、3 か月後に誰も覚えていない場合、fieldaccess はできればすぐに壊れます。

apache commons BeanUtils のようなライブラリがあることに注意してください (Spring にもあると思います)。これはそれを行い、たとえばハッシュ マップのようなより健全なインターフェイスを提供します。

于 2010-09-03T16:08:32.630 に答える
0

どのような方法で良いですか?

20 行の単体テストを作成して、どちらが高速かを確認できます。両方を書いて、どちらが読みやすいかを調べることができます。1 つの方法が読みやすく高速である場合は、それを選択してください。そうでない場合は、毒を選択する必要があります...

于 2010-09-03T16:08:53.993 に答える