ホームページ  >  記事  >  Java  >  Java アノテーション機能の詳細な説明

Java アノテーション機能の詳細な説明

黄舟
黄舟オリジナル
2017-03-30 10:51:461208ブラウズ

アノテーションとは何ですか?

アノテーションは中国語で注釈として翻訳され、プログラム自体のロジックに加えて追加のデータ情報を提供することを意味します。 アノテーションはアノテーションが付けられたコードに直接影響しませんが、アノテーションが付けられたコードと直接対話することはできませんが、他のコンポーネントはこの情報を使用できます。

アノテーション情報は class ファイルにコンパイルすることも、実行時に取得できるように Java 仮想マシンに保持することもできます。注釈は、注釈自体に追加することもできます。

それらの オブジェクトは注釈を付けることができます

クラス、メソッド、変数、パラメータ、およびパッケージはすべて注釈を付けることができます。

組み込みアノテーション

@Override オーバーロード親クラスの @Deprecated メソッドまたは型は推奨されなくなりました

@SuppressWarnings により、コンパイル中の警告メッセージが表示されなくなります。パラメータとして Stringarray を受け取る必要があります。 使用可能なパラメータは次のとおりです:

  • unchecked

  • path

  • serial

  • finally

  • fallthrough

他のアノテーションと併用可能

@Retention

宛保存されるアノテーションのライフサイクルを決定するには、Enum オブジェクト RetentionPolicy をパラメータとして受け取る必要があります。

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

@Documented Documented

@Target

は、Annotationが変更できる範囲を表し、Enumオブジェクトの配列EnumTypeをパラメータとして受け取ります。

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}

@Inherited

このアノテーションは、アノテーションが付けられたクラスのサブクラスに影響を与える可能性があります。

カスタマイズされたアノテーション

JSE5.0以降、アノテーションをカスタマイズできるようになりました。以下に簡単な例を示します。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {

}

以下の Person オブジェクトはカスタム MethodAnnotation を使用します。

public class Person {

    public void eat() {
        System.out.println("eating");
    }

    @MethodAnnotation
    public void walk() {
        System.out.print("walking");
    }

}

リフレクションを通じてアノテーション情報を取得できます。

 Class<Person> personClass = Person.class;
        Method[] methods = personClass.getMethods();
        for(Method method : methods){
            if (method.isAnnotationPresent(MethodAnnotation.class)){
                method.invoke(personClass.newInstance());
            }
        }

出力:

walking

カスタム アノテーションにメソッドを追加することもできます。

@Target(ElementType.TYPE)
public @interface personAnnotation {
    int id() default 1;
    String name() default "bowen";
}

以下はpersonAnnotationの使い方です。

@personAnnotation(id = 8, name = "john")
public class Person {

    public void eat() {
        System.out.println("eating");
    }

    @MethodAnnotation
    public void walk() {
        System.out.print("walking");
    }

}

アノテーションの処理方法

Java ソース コードがコンパイルされると、コンパイラーのプラグイン アノテーション プロセッサーがこれらのアノテーションを処理します。プロセッサはレポート情報を生成したり、追加の Java ソース ファイルやリソースを作成したりできます。注釈自体が RententionPolicy ランタイム クラスで追加された場合、Java コンパイラーは注釈のメタデータをクラス ファイルに保存します。次に、Java 仮想マシンまたは他のプログラムはこのメタデータを検索し、それに応じて処理できます。

もちろん、注釈を処理できる注釈プロセッサに加えて、リフレクションを使用して自分で注釈を処理することもできます。 Java SE 5 には AnnotatedElement と呼ばれる インターフェース があり、Java のリフレクティブ オブジェクト クラス、クラス、コンストラクター、フィールド、メソッド、およびパッケージはすべてこのインターフェースを実装しています。このインターフェースは、Java 仮想マシンで現在実行されている注釈付きプログラム要素を表すために使用されます。このインターフェイスを通じて、リフレクションを使用して注釈を読み取ることができます。 AnnotatedElement インターフェイスは、RUNTIME でマークされた注釈にアクセスできます。対応するメソッドは getAnnotation、getAnnotations、および isAnnotationPresent です。注釈タイプはクラスと同じようにコンパイルされてバイナリに保存されるため、これらのメソッドによって返される注釈は、クエリ通常の Java オブジェクトと同じようにクエリできます。

アノテーションの広範な使用

アノテーションは、さまざまな フレームワーク やライブラリで広く使用されています

Junit

Junit は、Junit を使用する非常に有名な 単体テスト フレームワークです。 。

  • @Runwith カスタム テスト クラス Runner

  • @ContextConfiguration Spring の ApplicationContext を設定します

  • @DirtiesContext 次のテストを実行する前に ApplicationContext をリロードします。

  • @Before テスト メソッドを呼び出す前に初期化します。

  • @後処理でテスト メソッドを呼び出した後

  • @Test は、そのメソッドがテスト メソッドであることを示します

  • @Ignore をテスト クラスまたはテスト メソッドに追加して、実行を無視できます。

  • @BeforeClass: テストクラス内のすべてのテストメソッドが実行される前に呼び出され、一度だけ呼び出されます (マークされたメソッドはstaticである必要があります)

  • @AfterClass: テストクラス内のすべてのテストメソッドが実行された後に呼び出され、一度だけ実行されます (マークされたメソッドは静的である必要があります)

Spring

Spring は設定地獄として知られており、多くの Annotation があります。

  • @Service サービスクラスにアノテーションを付ける

  • @Repository DAOクラスにアノテーションを付ける

  • @Component コンポーネントクラスにアノテーションを付ける

  • @Autowired SpringにBeanを自動的にアセンブルさせる

  • @Transactional Confいろいろ考えます

  • @Scope オブジェクトの生存スコープを設定します

  • @Controller コントローラークラスにアノテーションを付けます

  • @RequestMapping URL パスマッピング

  • @PathVariable メソッドのパラメータをパスにマップします

  • @ RequestParamリクエストパラメータをメソッドにバインドする変数

  • @ModelAttribute モデルにバインド

  • @SessionAttributes セッション属性に設定

Hibernate

  • @Entity エンティティ Bean を変更

  • @Tエンティティクラスはテーブルにマッピングされます。データベース

  • @Column マッピング列

  • @Id マッピング ID

  • @GeneratedValue このフィールドは自動増加します

  • @Version バージョン管理または同時実行制御

  • @OrderBy 並べ替えルール

  • @Lob ラージ オブジェクト アノテーション

Hibernate には、ユニオンと継承 に関するアノテーションも多数ありますが、ここに列挙するのは無意味です。

JSR 303 – Bean Validation

JSR 303 – Bean Validation はデータ検証仕様であり、Java Bean の検証は主に Java アノテーションを通じて実装されます。注釈が付けられた要素は true である必要があります false である必要があります @Min(value) 注釈が付けられた要素は数値である必要があり、その値は指定された最小値以上である必要があります

  • @Max(value) 注釈が付けられた要素は、数値、その値は指定された値以下である必要があります @DecimalMin(value) の最大値 注釈付きの要素は数値である必要があり、その値は指定された最小値以上である必要があります

  • @DecimalMax(value) 注釈が付けられた要素は数値である必要があり、その値は指定された最大値以下である必要があります

  • @Size(max, min)注釈が付けられた要素のサイズは、指定された範囲

  • @Digits (整数、分数)注釈付き要素は数値でなければなりません、値は許容範囲内である必要があります

  • @Past 注釈付き要素は過去の日付である必要があります

  • @Future注釈付きの要素は将来の日付である必要があります

  • @Pattern(value) 注釈付きの要素は、指定された

    正規表現 に準拠する必要があります
  • 実際、注釈を使用するフレームワークやライブラリはたくさんあるので、ここでは説明しませんここにそれらを 1 つずつ列挙して、皆さんが推論を導き、Java のアノテーションについてより深く理解できることを願っています。

以上がJava アノテーション機能の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。