Javaリフレクションを使用して(何らかの理由で)構築された多くのクラスがあるとします。ここで、 で注釈が付けられたフィールドに値をポストインジェクトする必要があります@PostInject
。
public class SomeClass {
@PostInject
private final String someString = null;
public void someMethod() {
// here, someString has a value.
}
}
私の質問は:リフレクションを使用してフィールドを設定する高速な方法は何ですか?
多くのクラスでこれを非常に頻繁に行う必要があることを忘れないでください。そのため、パフォーマンスが重要です。
私が直感で行うことは、次の疑似コードで示されています。
- クラスのすべてのフィールドを取得する
clazz.getFields();
- @PostInject で注釈が付けられているチェック
eachField.getAnnotation(PostInject.class);
- これらのフィールドにアクセスできるようにする
eachAnnotatedField.setAccessible(true);
- それらを特定の値に設定します
eachAnnotatedField.set(clazz, someValue);
残念ながら、すべてのフィールドを取得するのは最も時間がかかります。
最初からフィールドを知っている場合、誰かがフィールドを取得できますか?
注: メソッドを使用してフィールドを設定できるようなインターフェイスをクラスに実装させることはできません。POJOが必要です。
注 2: ポスト フィールド インジェクションが必要な理由: API ユーザーの観点からは、final フィールドを使用できる必要があります。さらに、フィールドのタイプと数が事前に API によって認識されていない場合、インターフェイスを使用してフィールドの初期化を実現することは不可能です。
注 2b: ユーザーの観点からは、最終的な契約は破棄されません。最終的なままです。まず、フィールドが初期化され、その後変更できなくなります。ところで、この概念を使用する API はたくさんありますが、そのうちの 1 つが JAXB (JDK の一部) です。