Javaカスタム注釈-spring@Autowiredの簡易実装

2655 ワード

springを使ったことのある人はみな@Autowiredを知っていますが、似たような注釈の内部はどのように実現されていますか?次の例では、類似の実装プロセスについて説明します.
この例を見る前にjava反射メカニズムを理解する必要があります.あまり深く入り込む必要はありません.反射が何をしているのかを知るだけでいいです.コードが少なく、複雑ではありません.見ると分かります.この例を通じて反射、カスタム注釈などの知識を初歩的に認識することができます.
まず、カスタム注釈のコードを書きます.書く前に、次の要素注釈を理解する必要があります.
@Target:
@Targetは、Annotationによって修飾されたオブジェクト範囲を示します.Annotationはpackages、types(クラス、インタフェース、列挙、Annotationタイプ)、タイプメンバー(メソッド、構築メソッド、メンバー変数、列挙値)、メソッドパラメータおよびローカル変数(ループ変数、catchパラメータなど).Annotationタイプの宣言でtargetを使用すると、その修飾のターゲットがより明確になります.
≪アクション|Actions|emdw≫:注釈を記述するための使用範囲(すなわち、説明された注釈がどこで使用できるか)
値(ElementType)は次のとおりです.
    1.CONTRUCTOR:コンストラクタ2を記述するために用いる.FIELD:ドメイン3の記述に用いる.LOCAL_VARABLE:局所変数4を記述するために用いる.METHOD:説明方法5に用いる.PACKAGE:パケット6を記述するためのものである.PARAMETER:パラメータ7の記述に用いる.TYPE:クラス、インタフェース(注釈タイプを含む)またはenum宣言の記述に使用
@Retention:
@Retentionは、このAnnotationが保持される時間の長さを定義します.一部のAnnotationはソースコードにのみ表示され、コンパイラによって破棄されます.他のいくつかはclassファイルにコンパイルされています.classファイルにコンパイルされたAnnotationは、仮想マシンによって無視される可能性がありますが、classがマウントされたときに読み込まれるものもあります(Annotationとclassは使用上分離されているため、classの実行には影響しません.このmeta-Annotationを使用すると、Annotationの「ライフサイクル」を制限できます.
≪アクション|Actions|emdw≫:注釈情報を保存するには、注釈のライフサイクルを記述するためにどのレベルが必要かを示します(すなわち、説明された注釈がどの範囲で有効かを示します).
値(RetentionPoicy)は次のとおりです.
    1.SOURCE:ソースファイルで有効(すなわちソースファイル予約)2.CLASS:classファイルで有効(すなわちclass予約)3.RUNTIME:実行時に有効(すなわち実行時予約)
Retention meta-annotationタイプにはjavaからの値をとる唯一のvalueがメンバーとして存在する.lang.annotation.RetentionPolicyの列挙タイプ値.
@Documented:
@Documentedは、他のタイプのannotationを記述するために、注釈されたプログラムメンバーの共通APIとして使用されるべきであり、javadocのようなツールでドキュメント化することができる.Documentedはタグ注記で、メンバーはいません.
サンプルコードを次に示します
/**
 *     
 * @author lc
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
    /**
     *   
     * @return
     */
    int num() default 1;
}

次に注釈を使用するコード
public class Test {
	@TestAnnotation(num=45)
	private static int a;//    
	private int b = 9; //        ,        

	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
		TestZjImpl.set(Test.class);
		System.out.println(a);
	}
}

最後に,反射機構により注釈の変数に値を付与する.
public static void set(Class c) throws IllegalArgumentException, IllegalAccessException{
		Field[] fields = c.getDeclaredFields();//      
		for(int i=0; i

コードは簡単ですが、見ればわかります.springの@Autowiredはもちろん簡単ではありません.もっと知りたいのはソースコードを見ることができます.他の使い方はサンプルコードによって自分で発揮することができます.