Java注記@Annotation

8067 ワード

Java注記にも公開
1.注釈の由来
注釈を導入する前に、異なるタイプのアプリケーションでXMLを標準のコード構成メカニズムとして使用し、プログラマーたちはそのコードの形式がまだ標準化されていないことを説明し、transientキーワード、注釈、インタフェースなど、コードとXMLのデカップリング、および将来のこのようなデカップリングアプリケーションのメンテナンスは低くない.これは明らかに優雅な方法ではない.それに伴うJDK 5.0は新しい記録メタデータの形式を導入する--注釈はJavaに導入される.その役割はプログラミング要素を修飾することです.プログラミング要素とは?たとえば、パッケージ、クラス、構築方法、メソッド、メンバー変数などです.
2.注釈とは
DK5.0のタイプ:1、クラス(class)2、インタフェース(interface)3、列挙(enum)4、注釈(Annotation)そのため、注釈は他の3つのタイプと同様に定義、使用、および独自の属性、方法を含むことができる
注記の分類
(1)タグ注記:注釈の内部に属性がないことをタグ注釈と呼ぶ使い方:@注釈名使用例:@MarkAnnotation
(2)単一値注記:注記の内部には、単一値注記と呼ばれる属性が1つしかありません.使用方法:@注記名(属性名=属性値)使用例:@SingleAnnotation(value="abc")/@SingleAnnotation("abc")*(属性名=属性値)と書くこともできますが、以下の2つの条件を満たす必要があります.1、この注記は単一値注記2、注記のプロパティ名はvalueでなければなりません
(3)多値注記:注記の内部に複数の属性があり、多値注記と呼ばれる使い方:@注記名(属性名1=属性値1、属性名2=属性値2・・)使用例:@MultipliedAnnotation(value 1=abc、value 2=30・・)
メタ注記
Javaはいくつかのメタ注釈を提供しています(下に紹介します)
Target、Retention、Documented、Inherited
メタ注記の役割:
注釈クラス(annotate Classes)に使用できます.
注記インタフェース(annotate Interfaces)に使用できます.
注釈列挙タイプ(annotate Enums)に使用できます.
したがって、注釈も同様に注釈(annotate Annotations)に使用することができる.
3.注釈構文
3.1注記の説明
簡単な例を見てみましょう

@Annotation
@Annotation1(info = "I am Annotation")
public AnnotationMethod(){
//
}

コードから一歩一歩:
01.「@」を接頭辞として注釈を宣言し、コンパイラに説明する.この要素(Annotation)は注釈である
02.注釈の後()、その属性を表記し、キー値ペアの形式で、注釈が1つの要素しかない場合(または1つの要素の値を指定するだけで、その他はデフォルト値を使用する)、@Annotation("I am Annotation");要素が指定されていない場合は、カッコは必要ありません.
03.注釈の用途:Javaプログラムの各要素に表示して使用することができる:クラス、ドメイン、方法、パッケージ、変数など
3.2事前定義された注記
3.2.1 @Override
メソッドが親クラスを上書きしているかどうかを識別するためのメソッドです.
3.2.2 @Deprecated
タグ注記に属する.タグ注記とは、ソースプログラムにこのタグを加えると、プログラムのコンパイルに影響しませんが、コンパイラが警告情報を表示する場合があります.
古いメソッドまたはクラスを明記するために使用
3.2.3 @SuppressWarnnings
クラス、メソッド、メンバー変数、変数の初期化に対する選択的なクローズコンパイラの警告.
  
 

deprecation: ;
unchecked: , (Generics) ;
fallthrough: Switch Break ;
path: 、 ;
serial: serialVersionUID ;
finally: finally ;
all: 。

4.

4.1
 
public @interface CustomAnnotationClass

** @interface** .

4.2

, , == (Target==) == (Retention Policy==) 。

4.2.1 @Target

( 、 ), ElementType



public enum ElementType {
/* 、 ( ) enum /
TYPE,
/**            ( )  ,  enum   */
FIELD,

/**               */
METHOD,

/**               */
PARAMETER,

/**                */
CONSTRUCTOR,

/**                */
LOCAL_VARIABLE,

/** ( )*/
ANNOTATION_TYPE,

/**             */
PACKAGE,

/**
 *               (1.8   )
 * @since 1.8
 */
TYPE_PARAMETER,

/**
 *       (1.8   )
 * @since 1.8
 */
TYPE_USE

}

  • がTarget を しない 、この は の の に
  • を することができる.
  • @Target(ElementType.METHOD)
  • の を
  • の を {}を して
  • をカンマで る.@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    4.2.2 @Retention
    を するライフサイクルには、ソース・レベル、クラス・ファイル・レベル、またはランタイム・レベルの3つの があります.
  • SOURCE: はコンパイラによって される(このタイプの はソースコードにのみ され、ソースコードがコンパイルされた 、 は され、コンパイルされたclassファイルには されない)
  • CLASS: はclassファイルで ですが、VMによって されます(このタイプの はソースコードとclassファイルに され、 には マシンにロードされません). にRetention が されていない 、デフォルト はJava 、@Override、@Deprescated、@SuppressWarningなどのCLASSです.
  • RUNTIME: は (JVM)にも されるので、SpringMvcの@Controller、@Autowired、@RequestMappingなど、 の (ソースコード、classファイル、 に の がある)を メカニズムで み ることができます.
    4.2.3 の


    @Target(ElementType.TYPE) //
    @Retention(RetentionPolicy.RUNTIME) //
    @interface CustmAnnotationClass {
    /**
    * Java
    * 1.
    * 2.
    */
    String info() default "Annotation";

    }

    @CustmAnnotationClass(info="OOP")
    public class Test {

    }


  • は、
  • のタイプをサポートします.
  • すべての タイプ(int,float,boolean,byte,double,char,long,short)
  • String
  • Class
  • enum
  • Annomation
  • タイプの
  • は、 のタイプ、すなわちネストされた
  • として することができる.
  • デフォルト
  • にはデフォルト があるか、 を するときに の を する があります.
    の では、ソースコードで するも、 インタフェースでデフォルト を してもnullを とすることはできません.もちろん、 の や などの な を して、 が しないことを します.
    4.2.4 の
  • はキーワードextendsを して@interfaceを することはできませんが、 はコンパイル 、コンパイラはjavaを に します.lang.annotation.Annotationインタフェース
  • @Inherited

  • @Inheritedを していますが、これは に されているわけではありません.ただ、@Inheritedを することで、サブクラスClassオブジェクトにgetAnnotations()を して、@Inheritedによって が された を させることができます.つまり、このクラスはサブクラスで することなく、 にこの をサブクラスに し、 、1つのクラスは クラスを し、 クラスの を しません.これは、 を する と に します. されたコードに する を し、それらの を しません.
    したがって,@Inheriated は のあるクラスでのみ が し,インタフェースや クラスでは しない.デフォルトでは、 の はクラスに されません. するにはInherited を けなければなりません.
    ここをクリックしてみてもいいですよ
    4.2.5その の プロパティの
  • @Documented はjavadocの
  • に されます.
    5. の ( )
  • を する にimport javaを する がある.lang.reflect.* に されます.
  • クラスまたはインタフェースの を するには、
  • というコードを します.


    Annotation annotation = TestAnnotation.class.getAnnotation(MyAnnotation.class);

  • すべての を するには、
  • という を します.


    Annotation[] annotations = TestAnnotation.class.getAnnotations();

    Annotation[] annotations = TestAnnotation.class.getDeclaredAnnotations();



    getDeclaredAnnotationsはgetAnnotationsと ていますが、getDeclaredAnnotationsは を まない のメンバーのすべての を ています.getAnnotationsは を むすべての を た.
  • のメンバーの を るには、まずこのメンバーを てから、 する を ることができる.myMethodの が られた .


  • Method method = TestAnnotation.class.getMethod("myMethod", null);

    Annotation annotation = method.getAnnotation(MyAnnotation.class);


    : を して を るには、この を する があります.
    @Retention(RetentionPolicy.RUNTIME)で します.
  • タイプの がこの
  • に するか かを する.


    isAnnotationPresent(Class extends Annotation> annotationClass)


    6.Java 8の
  • @Repeatableは、 じ @Repeatable(MyAnnotation.class)
  • を じ で り すことを す.
  • ElementType
  • TYPE_PARAMETERとTYPE_USEでは、Java 8の に は1つの (フィールド、クラス、メソッドなど)にしか されません.Java 8の 、 しいTYPE_PARAMETERは、 タイプパラメータに できますが、TYPE_USEは のタイプ(classを く)を するために できます.
    7. の き
    7.1 の :
    Annotationを したAnnotate の は、ElementType の ごとに2つの があります( : かりやすいように、 で するTestCaseは のカスタムコメントです)
    (1)isAnnotationPresent(TestCase.class)//その がTestCaseによって されているかどうかを する
    (2)getAnnotation(TestCase.class)/TestCaseのクラスオブジェクトを
    7.2 の は:
    (1)まず により oの を る
    (2) についてisAnnotationPresent(TestCase.class)を いてTestCaseに されているか かを する( は.class!)
    (3)あるメソッドmethodがTestCaseによって されている 、methodのgetAnnotation(TestCase.class)によってTestCaseのクラスオブジェクトtcが られる
    (4)tcのvalue()メソッドにより,このクラスオブジェクトの valueを る.
    ( :ここで するvalue()メソッドは、TestCaseで されたvalue であり、 で されたvalueが であり、 であることを する)
    (5)methodメソッドのinvoke(o,value)を び し,valueでmethodをテストする

    Java アドレス:http://docs.oracle.com/javase/tutorial/java/annotations/
    WikipediaのJava についての :http://en.wikipedia.org/wiki/Java_annotation
    Java 250:http://en.wikipedia.org/wiki/JSR_250
    Oracle ホワイトペーパー:http://www.oracle.com/technetwork/articles/hunter-meta-096020.html
    API:http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/package-summary.html