私は、(何らかの理由で)Javaのリフレクションを使って構築されたたくさんのクラスを持っているとします。今私は@PostInject
と注釈された であるフィールドに値をポスト注入する必要があります。Java:リフレクションを使用してフィールドを注入する最も速い方法は何ですか?
public class SomeClass {
@PostInject
private final String someString = null;
public void someMethod() {
// here, someString has a value.
}
}
私の質問は:リフレクションを使用してフィールドを設定するための高速な方法は何ですか?
多くのクラスで非常に頻繁に行う必要があることを覚えておいてください。つまり、パフォーマンスが適切な理由は です。
この擬似コードで示されている私は直感で行うだろう:
- が
eachField.getAnnotation(PostInject.class);
- @PostInject
でアノテートされたクラス
clazz.getFields();
- チェックのすべてのフィールドを取得これらのフィールドにアクセスできるようにする。
eachAnnotatedField.setAccessible(true);
- 一定値
eachAnnotatedField.set(clazz, someValue);
私はすべてのフィールドを取得することは行うには最も遅いものであることを恐れています。
フィールドを最初から知っている人はいますか?
注:クラスにメソッドを使用してフィールドを設定できるようにするインタフェースを実装することはできません。 私は
POJOが必要です。
注2:ポストフィールド注入が必要な理由:APIユーザーの観点からは、最終フィールドを使用できる必要があります。さらに、APIによってフィールドの型および数が事前に分かっていない場合、インタフェースを使用してフィールドの初期化を行うことは不可能である。
NOTE2b:ユーザーの観点から、最終契約がない壊れています。それは最終的なままです。最初に、フィールドは初期化され、その後は変更できません。ところで、このコンセプトを使用する多くのAPIがありますが、その1つはJAXB(JDKの一部)です。
私はあなたがこれをする必要がある理由について興味がありますか?この後ろに興味深い話がありますか?それがあれば、それを分かち合うことができますか? –
私はJAXBと同様のマーシャラー| unmarshallerを書いていますが、もっと特殊な(したがって制限されています)。アノテーション付きPOJOは非常に柔軟性があります。 –
実装者にアノテーションを使用する必要がある場合は、ここでインターフェイスを使用する以上のことは得られていないし、POJOを実際に使用しているわけでもありません - http://en.wikipedia.org/wiki/Plain_Old_Java_Object#Contextual_variations – Nate