Javaではどのように、どこでアノテーションが使用されますか?


218

アノテーションを使用できる主な分野は何ですか?この機能は、XMLベースの構成に代わるものですか?


2
cdb、バウンティのアイデアを完全に理解しているとは思いません-ここにはかなり良い答えがたくさんあります。それらに欠けているものや具体的に探しているものを明確にせずに、バウンティを追加しました。(これもここで行いました:stackoverflow.com/questions/1746550/…
delfuego

5
わかりました。これは非常に古いことですが、@ delfuego:OPにバウンティを誤って使用していることを伝える場合は、バウンティを正しく使用する方法を説明することで、フォローアップが役立つ場合があります。
ポップス

回答:


308

注釈は、メタ-メタオブジェクト他記述するために使用することができるメタオブジェクト。メタオブジェクトは、クラス、フィールド、およびメソッドです。オブジェクトにそのメタオブジェクト(たとえばanObj.getClass())を要求することは、イントロスペクションと呼ばれます。イントロスペクションはさらに進んで、メタオブジェクトにその注釈(たとえばaClass.getAnnotations)を尋ねることができます。イントロスペクションとアノテーションは、いわゆるリフレクションメタプログラミングに属しています

注釈を有効にするには、何らかの方法で解釈する必要があります。注釈は、開発時にIDEまたはコンパイラーによって、または実行時にフレームワークによって解釈できます。

注釈処理は非常に強力なメカニズムであり、さまざまな方法で使用できます。

  • 要素の制約または使用法を説明する:@Deprecated, @Override、または@NotNull
  • 要素の「性質」を説明するには、例えば @Entity, @TestCase, @WebService
  • 要素の動作を説明するには: @Statefull, @Transaction
  • 要素の処理方法を説明するには: @Column, @XmlElement

すべての場合において、注釈は要素を説明し、その意味を明確にするために使用されます。

JDK5以前は、注釈で表現される情報は別の場所に保存する必要があり、XMLファイルが頻繁に使用されていました。ただし、アノテーションはJavaコード自体に属しているため、XMLよりも操作が簡単であるため、アノテーションを使用する方が便利です。

注釈の使用:

  • XDocletなどのドキュメント
  • コンパイル
  • IDE
  • JUnitなどのテストフレームワーク
  • SpringなどのIoCコンテナ
  • XMLなどのシリアライゼーション
  • アスペクト指向プログラミング(AOP)、例えばSpring AOP
  • アプリケーションサーバー、例えばEJBコンテナ、Webサービス
  • オブジェクトリレーショナルマッピング(ORM)(Hibernate、JPAなど)
  • などなど...

...プロジェクトLombokを見てみましょう。プロジェクトはLombokで、アノテーションを使用して生成方法equalshashCodeメソッドを定義しています。


50

Javaの注釈には複数のアプリケーションがあります。まず第一に、それらはコンパイラー(またはコンパイラー拡張)によって使用されます。たとえば、Overrideアノテーションを考えます。

class Foo {

    @Override public boolean equals(Object other) {
        return ...;
    }
}

これは実際にはJava JDKに組み込まれています。一部のメソッドにタグが付けられている場合、コンパイラーはエラーを通知します。これは、基本クラスから継承されたメソッドをオーバーライドしませ。このアノテーションは、実際にメソッドをオーバーライドしようとするものの、メソッドで指定されたシグネチャがオーバーライドされるメソッドのシグネチャと一致しないために失敗するという一般的な間違いを回避するのに役立ちます。

class Foo {

    @Override public boolean equals(Foo other) {  // Compiler signals an error for this one
        return ...;
    }
}

JDK7以降、注釈はすべてのタイプで許可されます。この機能は、次のようにNotNullなどのコンパイラアノテーションに使用できるようになりました。

public void processSomething(@NotNull String text) {
    ...
}

これにより、コンパイラは、変数およびnull値の不適切な使用またはチェックされていない使用について警告することができます。

アノテーションのもう1つのより高度なアプリケーションには、実行時のリフレクションとアノテーション処理が含まれます。これは(私が思うに)注釈を「XMLベースの構成の置き換え」と呼ぶときにあなたが心に描いていたものです。これは、必要なメタデータと構成情報を提供するために、たとえば、さまざまなフレームワークとJCP標準(永続性、依存性注入、ユーザーが名前を付ける)で使用される種類の注釈処理です。


18

注釈は、Javaソースファイルに追加されるメタデータ(データに関するデータ)の形式です。これらは、クライアントコードの統合を簡素化するために、フレームワークで主に使用されます。私の頭の上のいくつかの実世界の例:

  • JUnit 4- @TestJUnitランナーに実行させたい各テストメソッドにアノテーションを追加します。テストの設定に関連する追加の注釈もあります(@Beforeおよびなど@BeforeClass)。これらはすべて、それに応じてテストを実行するJUnitランナーによって処理されます。これはXML構成の代わりと言えるかもしれませんが、注釈はより強力な場合があり(たとえば、リフレクションを使用できます)、参照しているコードに近いこともあります(@Test注釈はテストメソッドの直前にあるため、目的はそのメソッドの明確です-ドキュメントとしても機能します)。一方、XML構成はより複雑になり、アノテーションよりもはるかに多くのデータを含めることができます。

  • テラコッタ-注釈とXML構成ファイルの両方を使用します。たとえば、@Rootアノテーションは、アノテーション付きフィールドがルートであり、そのメモリがVMインスタンス間で共有される必要があることをTerracottaランタイムに通知します。XML構成ファイルは、サーバーを構成し、インストルメントするクラスをサーバーに通知するために使用されます。

  • Google Guice-例は@Injectアノテーションです。コンストラクターに適用すると、定義されたインジェクターに基づいて、Guiceランタイムが各パラメーターの値を検索します。@Inject注釈は、XML設定ファイルを使用して複製することは非常に難しいだろう、とそれが参照するコンストラクタへの近さは、(あなたが設定したすべての依存性の注入を見つけるために、巨大なXMLファイルに検索することを想像する)非常に便利です。

うまくいけば、さまざまなフレームワークでアノテーションがどのように使用されるかを理解できたでしょう。


12

Javaの注釈は、クラス、フィールド、メソッドを説明する手段を提供します。基本的に、これらはJavaソースファイルに追加されるメタデータの形式であり、プログラムのセマンティクスに直接影響を与えることはできません。ただし、注釈は実行時にReflectionを使用して読み取ることができます。このプロセスはイントロスペクションとして知られています。次に、クラス、フィールド、またはメソッドの変更に使用できます。

この機能は多くの場合、ライブラリおよびSDK(hibernate、JUnit、Spring Framework)で悪用され、これらのライブラリまたはSDKを操作するためにorerを使用しない限り、プログラマーが行うコードの量を簡略化または削減します。したがって、注釈とJavaと密接に関連するリフレクション作業。

また、注釈の可用性をコンパイル時または実行時のいずれかに制限します。以下は、カスタム注釈の作成に関する簡単な例です。

Driver.java

package io.hamzeen;

import java.lang.annotation.Annotation;

public class Driver {

    public static void main(String[] args) {
        Class<TestAlpha> obj = TestAlpha.class;
        if (obj.isAnnotationPresent(IssueInfo.class)) {

            Annotation annotation = obj.getAnnotation(IssueInfo.class);
            IssueInfo testerInfo = (IssueInfo) annotation;

            System.out.printf("%nType: %s", testerInfo.type());
            System.out.printf("%nReporter: %s", testerInfo.reporter());
            System.out.printf("%nCreated On: %s%n%n",
                    testerInfo.created());
        }
    }
}

TestAlpha.java

package io.hamzeen;

import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;

@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {

}

IssueInfo.java

package io.hamzeen;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Hamzeen. H.
 * @created 10/01/2015
 * 
 * IssueInfo annotation definition
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {

    public enum Type {
        BUG, IMPROVEMENT, FEATURE
    }

    Type type() default Type.BUG;

    String reporter() default "Vimesh";

    String created() default "10/01/2015";
}

6

XMLベースの構成の代替ですか?

完全ではありませんが、コード構造(SpringでのJPAマッピングや依存性注入など)に密接に対応する構成は、多くの場合、アノテーションに置き換えることができ、通常は冗長性が少なく、煩わしく、痛みを伴います。注目すべきほとんどすべてのフレームワークがこの切り替えを行いましたが、古いXML構成は通常オプションとして残っています。


おそらくアノテーションは、JSFのfaces-config XMLファイルを完全に排除することができます。それを行う方法を見つけようとしている間、この投稿に出くわしました...
ブライアンノブラウチ

6

注釈には2つのビューがあります

  1. ユーザービュー、ほとんどの場合、注釈はショートカットのように機能し、キーストロークを節約し、プログラムを読みやすくします

  2. ベンダーの見解、プロセッサの注釈の見方はより軽量な「インターフェース」であり、プログラムは特定のインターフェースを明示的に「実装」せずに何かに直面します(ここでは注釈)

たとえば、JPAでは次のように定義します

@Entity class Foo {...}

の代わりに

class Foo implements Entity {...}

どちらも同じことを話します「FooはEntityクラスです」


3

注釈を使用できる場所

注釈は、クラス、フィールド、メソッド、およびその他のプログラム要素の宣言に適用できます。宣言で使用される場合、各注釈は通常、独自の行に表示されます。

Java SE 8 Update:タイプの使用にアノテーションを適用することもできます。ここではいくつかの例を示します。

  • クラスインスタンス作成式:

    新しい@Interned MyObject();

  • タイプキャスト:

    myString =(@NonNull String)str;

  • implements句:

    UnmodifiableListクラスは@Readonly List <@Readonly T> {...}を実装します

  • スローされた例外宣言:

    void monitorTemperature()が@Critical TemperatureException {...}をスローする



2

JPA(Java EE 5から)は、アノテーションの(過剰な)使用の優れた例です。Java EE 6はまた、RESTful Webサービスや古き良きサーブレットAPIごとの新しいアノテーションなど、多くの新しい領域にアノテーションを導入します。

ここにいくつかのリソースがあります:

アノテーションに引き継がれる/引き継がれるのは、構成の詳細だけでなく、動作を制御するためにも使用できます。これは、Java EE 6のJAX-RSの例でよくわかります。


1

これは、メソッド、クラス、またはフィールドレベルでクラスに注釈を付ける場合に便利です。

特定のクラスをテスト専用としてマークするために使用する独自の注釈を付けることができます。これは単に文書化の目的で使用することも、製品リリース候補のコンパイル時にフィルターで除外することもできます。

アノテーションを使用して、プラグインの名前など、プラグインフレームワークのようなメタデータを保存できます。

その単なるツールであり、多くの目的があります。


1

(a)コンパイラチェックまたは(b)コード分析により、コードに関する追加情報を添付します。

**

  • 組み込みのアノテーションは次のとおりです。:2つのタイプ

**

タイプ1)Javaコードに適用される注釈:

@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj) 

@Deprecated // indicates the deprecated method
Public doSomething()....

@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})

タイプ2)他の注釈に適用される注釈:

@Retention - Specifies how the marked annotation is storedWhether in code only, compiled into the class, or available at run-time through reflection.

@Documented - Marks another annotation for inclusion in the documentation.

@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to

@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).

**

  • カスタム注釈::

** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations


より良い理解のために以下のリンクを試してください:例を使って詳しく説明してください


http://www.javabeat.net/2007/08/annotations-in-java-5-0/


0

注釈は、外部構成ファイルの代わりとして使用できますが、完全な置き換えとは見なされません。Hibernate、JPA、EJB 3、およびJava EEに含まれるほぼすべてのテクノロジーなど、構成ファイルを置き換えるためにannotationiが使用された多くの例を見つけることができます。

とにかく、これは常に良い選択とは限りません。構成ファイルを使用する目的は通常、アプリケーションが実行されている環境の詳細からコードを分離することです。このような状況では、ほとんどの場合、構成を使用してアプリケーションを外部システムの構造にマップする場合、外部システムの詳細をソースコード内に含めることができるため、注釈は構成ファイルの適切な代替にはなりません。あなたの申請。ここでは、外部ファイルが最良の選択と見なされます。そうでない場合は、ソースコードを変更し、実行環境で関連する詳細を変更するたびに再コンパイルする必要があります。

注釈は、コンパイル時と実行時の両方で処理ツールにクラスとクラス構造を特別な方法で処理するように指示する追加情報でソースコードを装飾するのにはるかに適しています。@OverrideそしてJUnit @Testはそのような使用法の良い例であり、すでに他の回答で詳細に説明されています。

結局のところ、ルールは常に同じです。ソース内で変化するものをソースの内側に保ち、ソースとは独立して変化するものをソースの外側に保ちます。


0

Java EE 5では、XML構成よりもアノテーションの使用が優先されます。たとえば、EJB3では、EJBメソッドのトランザクション属性はアノテーションを使用して指定されます。インターフェースを実装する代わりに、アノテーションを使用してPOJOをEJBとしてマークし、特定のメソッドをライフサイクルメソッドとして指定することもできます。


0

Javaアノテーションの目的は、情報をアノテーション付きプログラム要素に関連付けることだけです。Javaアノテーションは、パッケージ、クラス(列挙型を含む)、インターフェース(アノテーション型を含む)、フィールド、メソッド、仮パラメーター、コンストラクター、またはローカル変数のいずれの宣言でも修飾子として使用できます。

Javaアノテーションは列挙型定数でも使用できます。このような注釈は、注釈を付ける列挙定数の直前に配置されます。通常、Javaアノテーションは他のすべての修飾子の前に配置されますが、これは必須ではありません。それらは他の修飾子と自由に混ぜ合わせることができます。

Javaアノテーションの詳細を読んでください。


0

以下は、注釈を使用できる場所の一部です。

a. Annotations can be used by compiler to detect errors and suppress warnings
b. Software tools can use annotations to generate code, xml files, documentation etc., For example, Javadoc use annotations while generating java documentation for your class.
c. Runtime processing of the application can be possible via annotations.
d. You can use annotations to describe the constraints (Ex: @Null, @NotNull, @Max, @Min, @Email).
e. Annotations can be used to describe type of an element. Ex: @Entity, @Repository, @Service, @Controller, @RestController, @Resource etc.,
f. Annotation can be used to specify the behaviour. Ex: @Transactional, @Stateful
g. Annotation are used to specify how to process an element. Ex: @Column, @Embeddable, @EmbeddedId
h. Test frameworks like junit and testing use annotations to define test cases (@Test), define test suites (@Suite) etc.,
i. AOP (Aspect Oriented programming) use annotations (@Before, @After, @Around etc.,)
j. ORM tools like Hibernate, Eclipselink use annotations

アノテーションの詳細については、このリンクを参照してください。

このリンクを参照すると、アノテーションを使用して簡単なテストスイートを構築する方法を確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.