72

Java アノテーションは@Target、そのアノテーションによって修飾できる可能性のあるジョインポイントを宣言するためのアノテーションでマークされます。列挙型の値TYPEFIELDMETHODなどElementTypeは明確で、簡単に理解できます。

質問

を使用する@Target(ANNOTATION_TYPE)理由 注釈付きの注釈は何に適していますか? 彼らの貢献は何ですか?それがどのように機能するか、なぜそれを使用する必要があるかについて説明してください。その使用法のいくつかの既存のよく知られた例も素晴らしいでしょう。

4

5 に答える 5

43

注釈付きの注釈を使用してメタ注釈を作成できます。たとえば@Transactional、Springでの次の使用法を検討してください。

/**
 * Shortcut and more descriptive "alias" for {@code @Transactional(propagation = Propagation.MANDATORY)}.
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(propagation = Propagation.MANDATORY)
public @interface RequiresExistingTransaction {
}

Springがアノテーションを処理できるようにすると、Springは@Transactional、それを運ぶクラスとメソッド、@Transactional またはそれのメタアノテーション(でアノテーションが付けられたアノテーション@Transactional)を探します。

とにかく、これは注釈付きの注釈を利用する方法の1つの具体的な例にすぎません。それらを使用するのが理にかなっているのは、ほとんどがSpringのようなフレームワークだと思います。

于 2013-02-26T23:03:09.727 に答える
3

たとえば、注釈が次のように見える場合

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeAnnotation {

    String description() default "This is example for class annotation";
}

コンパイラはこの状況で文句を言います

@SomeAnnotation
public class SomeClass {

    @SomeAnnotation    // here it's complaning
    public void someMethod(){}
}

変えたら

@Target(ElementType.TYPE) 

@Target({ElementType.METHOD, ElementType.TYPE}) 

それはもう文句を言いません。

于 2014-07-18T12:30:40.797 に答える
-4

アノテーションは基本的に、コードに付随する追加のメタデータ(情報)です。サイドタイプ(クラス、インターフェイス)、メソッド、および引数に沿って配置できます。

多くの場合、コンパイル時および実行時に役立ちます。Java EE 5 +、Spring、AspectJなどの多くの一般的なAPIは、コードの明確さと一貫性のためにアノテーションを活用しています。

多くの場合、注釈を使用すると、コードが読みやすく、理解しやすくなります。

Javaチュートリアルのアノテーションの章を読むことをお勧めします

以前は、メタデータはxmlファイルとして提供されることが多く、別のxml構成ファイルを検索する必要がある場合、コードを理解しようとする人にとっては困難です。最新のJavaサーブレットAPIでは、web.xmlマッピングとは対照的に、アノテーションを使用するだけでサーブレットのマッピングが可能です

@WebServlet("/response")
public class ResponseServlet extends HttpServlet {
  // servlet code here...
}
于 2013-02-26T23:13:03.010 に答える