ホームページ  >  記事  >  Java  >  Java の深い理解: アノテーションの基本概念

Java の深い理解: アノテーションの基本概念

巴扎黑
巴扎黑オリジナル
2017-06-26 09:18:321226ブラウズ

アノテーション(注釈)とは:

アノテーション(注釈)とは、Javaがメタプログラム内の要素に任意の情報と任意のメタデータ(メタデータ)を関連付けるための方法とメソッドを提供することです。アノテーション (annotation) は、プログラムがリフレクションを通じて指定されたプログラム要素の Annotation オブジェクトを取得し、Annotation オブジェクトを通じてアノテーション内のメタデータを取得できるインターフェースです。

アノテーションはJDK5.0以降のバージョンで導入されました。これは、ドキュメントの作成、コード内の依存関係の追跡、さらには基本的なコンパイル時のチェックの実行にも使用できます。ある意味、アノテーションは修飾子のように使用され、パッケージ、型、コンストラクター、メソッド、メンバー変数、パラメーター、およびローカル変数の宣言に適用されます。この情報は、Annotation の「name=value」構造ペアに格納されます。

Annotationのメンバーは、Annotation型のパラメータのないメソッドの形で宣言されます。そのメソッド名と戻り値によって、メンバーの名前と型が定義されます。ここには特定のデフォルト構文があります。任意の Annotation メンバーのデフォルト値を宣言できます。Annotation は、デフォルト値を定義しない Annotation メンバーの値として、name=value ペアを使用できます。もちろん、名前です。 =value ペアを使用して、他のメンバーのデフォルト値をオーバーライドすることもできます。これは、クラスの継承特性に似ています。親クラスのコンストラクターは、サブクラスのデフォルトのコンストラクターとして使用できますが、サブクラスによってオーバーライドすることもできます。

アノテーションを使用すると、任意の情報を特定のプログラム要素(クラス、メソッド、メンバー変数など)に関連付けることができます。ここには基本的なルールがあることに注意してください。注釈はプログラム コードの実行に影響を与えることはできません。注釈が追加されたり削除されたりしても、コードは一貫して実行されます。さらに、一部の注釈は実行時に Java のリフレクション API メソッドを通じてアクセスされますが、Java 言語インタープリターは動作中にこれらの注釈を無視します。コード内で注釈タイプが「機能しない」のは、Java 仮想マシンが注釈を無視しているためです。注釈タイプの情報は、一部のサポート ツールを介してのみアクセスおよび処理できます。この記事では、標準のアノテーション タイプとメタ アノテーション タイプについて説明します。これらのアノテーション タイプに付属するツールは、Java コンパイラです (もちろん、何らかの特別な方法でそれらを処理します)。


メタデータ(メタデータ)とは:

メタデータは、「データに関するデータ」を意味する単語メタデータから翻訳されています。
メタデータには多くの機能があります。たとえば、Javadoc コメントを使用してドキュメントを自動生成したことがあると思います。これはメタデータ関数の一種です。一般に、メタデータはドキュメントの作成、コードの依存関係の追跡、コンパイル時の形式チェックの実行、および既存の構成ファイルの置き換えに使用できます。メタデータの役割を分類する場合、現時点では明確な定義はありませんが、その役割に基づいて大きく次の 3 つのカテゴリに分けることができます:
1. ドキュメントの作成: コードで特定されたメタデータを介してドキュメントを生成する
2. コード分析: コード内で特定されたメタデータを通じてコードを分析します
3. コンパイル チェック: コード内で特定されたメタデータにより、コンパイラーは基本的なコンパイル チェックを実装できます
Java では、メタデータは Java コード内に存在するタグの形式で存在します。メタデータ タグは、プログラム コードのコンパイルや実行には影響しません。他のファイルを生成するため、または実行時に実行されるコードの記述情報を知るためにのみ使用されます。
まとめると:
まず、メタデータはJavaコード内にタグの形で存在します。
第二に、メタデータによって記述される情報はタイプセーフです、つまり、メタデータ内のフィールドは明確なタイプを持っています。
第三に、メタデータは、他のプログラムコンポーネントを生成するために、コンパイラー以外のツールによる追加の処理を必要とします。
4番目に、メタデータはJavaソースコードレベルでのみ存在することも、コンパイルされたクラスファイル内に存在することもできます。


アノテーションとアノテーションの種類:

アノテーション:

アノテーションは java5.0 によってもたらされた新しい構文を使用し、その動作は public や Final などの修飾子と非常によく似ています。各アノテーションには名前があり、メンバーの数は 0 以上です。アノテーションの各メンバーには、name=value ペア (JavaBean と同様) と呼ばれる名前と値があり、name=value によってアノテーションの情報がロードされます。

アノテーションタイプ:

アノテーションタイプは、アノテーションの名前、タイプ、メンバーのデフォルト値を定義します。 Annotation 型は特殊な Java インターフェイスであると言え、そのメンバー変数は制限されており、Annotation 型を宣言する際には新しい構文が必要です。 Java リフレクション API を介して Annotation にアクセスすると、戻り値はアノテーション型インターフェイスを実装したオブジェクトになります。このオブジェクトにアクセスすることで、その Annotation メンバーに簡単にアクセスできます。次の章では、java5.0 の java.lang パッケージに含まれる 3 つの標準アノテーション タイプについて説明します。


注釈のカテゴリ:

アノテーションパラメータの数に応じて、アノテーションを次の3つのカテゴリに分類できます:
1. マーカーアノテーション: メンバー定義のないアノテーションタイプをマークアノテーションと呼びます。この注釈タイプは、それ自体の有無のみを使用して情報を提供します。たとえば、次のシステム アノテーション @Override; 2. 単一値のアノテーション
3. 完全なアノテーション

アノテーションの使用法と目的に応じて、アノテーションを 3 つのカテゴリに分けることができます:

1. JDK 組み込みシステム アノテーション
2メタ アノテーション
3. カスタム アノテーション


システム組み込みの標準アノテーション:

アノテーションの構文は、@ 記号の使用を除いて、基本的に Java の固有の構文と一致しています。 JavaSE に組み込まれ、java.lang で定義されている 3 つの標準アノテーション:

@Override: このメソッドを変更して親クラスのメソッドを上書きするために使用されます
@Deprecated: 廃止されたメソッドを変更するために使用されます
@SuppressWarnings: 通知するために使用されます。 Java コンパイラは、特定のコンパイル警告を抑制します。

それでは、組み込みの 3 つの標準アノテーションの機能と使用シナリオを見てみましょう。


@Override、親クラスメソッドのオーバーライドに限定:

@Override は、アノテーションメソッドとして使用されるマークアノテーションタイプです。これは、アノテーションが付けられたメソッドが親クラスのメソッドをオーバーロードし、アサーションの役割を果たすことを示しています。親クラスのメソッドをオーバーライドしないメソッドでこの種のアノテーションを使用すると、Java コンパイラはコンパイル エラーで警告します。このアノテーションは、親クラスのメソッドをオーバーライドしようとしたときに間違ったメソッド名を記述したときによく登場します。使用方法は非常に簡単です。このアノテーションを使用する場合は、変更したメソッドの前に @Override を追加するだけです。次のコードは、@Override を使用して、親クラスをオーバーライドする試みの displayName() メソッドを変更する例ですが、タイプミスがあります。 、 Deprecated とマーク:

同様に Deprecated もマークアップの注釈です。型または型メンバーが @Deprecated で変更されると、コンパイラーはこの注釈付きプログラム要素の使用を阻止します。そして、この種の変更にはある程度の「継続性」があります。継承または上書きを通じてこの古い型またはメンバーをコード内で使用する場合、継承またはオーバーライドされた型またはメンバーが @Deprecated として宣言されていない場合でも、コンパイラーは依然として警告する必要があります。あなた。
javadoc の @Deprecated アノテーション タイプと @deprecated タグには違いがあることに注意してください。前者は Java コンパイラによって認識され、後者は javadoc ツールによって認識され、ドキュメント (ドキュメントを含む) を生成するために使用されます。プログラム メンバーが廃止される理由、それを禁止または置き換える方法の説明)。 Java の深い理解: アノテーションの基本概念 Java 5.0 では、Java コンパイラーは以前のバージョンと同様に @deprecated javadoc タグを検索し、それらを使用して警告メッセージを生成します。ただし、この状況は後続のバージョンでは変わるため、非推奨メソッドを修飾するために @deprecated javadoc タグの代わりに @Deprecated を使用し始める必要があります。
@Deprecated アノテーションは次のプログラムで使用され、メソッドを期限切れとしてマークし、@deprecated タグはメソッド アノテーションでメソッドを期限切れとしてマークします。コードは次のとおりです。りー
Java の深い理解: アノテーションの基本概念

  AppleService类的showTaste() 方法被@Deprecated标注为过时方法,在FruitRun类中使用的时候,编译器会给出该方法已过期,不推荐使用的提示。


SuppressWarnnings,抑制编译器警告:

  @SuppressWarnings 被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。在java5.0,sun提供的javac编译器为我们提供了-Xlint选项来使编译器对合法的程序代码提出警告,此种警告从某种程度上代表了程序错误。例如当我们使用一个generic collection类而又没有提供它的类型时,编译器将提示出"unchecked warning"的警告。通常当这种情况发生时,我们就需要查找引起警告的代码。如果它真的表示错误,我们就需要纠正它。例如如果警告信息表明我们代码中的switch语句没有覆盖所有可能的case,那么我们就应增加一个默认的case来避免这种警告。
  有时我们无法避免这种警告,例如,我们使用必须和非generic的旧代码交互的generic collection类时,我们不能避免这个unchecked warning。此时@SuppressWarning就要派上用场了,在调用的方法前增加@SuppressWarnings修饰,告诉编译器停止对此方法的警告。
  SuppressWarning不是一个标记注解。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告 名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
  annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值。实例如下:

Java の深い理解: アノテーションの基本概念
public class FruitService {
    
    @SuppressWarnings(value={ "rawtypes", "unchecked" })
    public static  List<fruit> getFruitList(){
        List<fruit> fruitList=new ArrayList();
        return fruitList;
    }
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static  List<fruit> getFruit(){
        List<fruit> fruitList=new ArrayList();
        return fruitList;
    }

    @SuppressWarnings("unused")
    public static void main(String[] args){
        List<string> strList=new ArrayList<string>();
    }
}</string></string></fruit></fruit></fruit></fruit>
Java の深い理解: アノテーションの基本概念

  在这个例子中SuppressWarnings annotation类型只定义了一个单一的成员,所以只有一个简单的value={...}作为name=value对。又由于成员值是一个数组,故使用大括号来声明数组值。注意:我们可以在下面的情况中缩写annotation:当annotation只有单一成员,并成员命名为"value="。这时可以省去"value="。比如将上面方法getFruit()的SuppressWarnings annotation就是缩写的。

   SuppressWarnings注解的常见参数值的简单说明:

    1.deprecation:使用了不赞成使用的类或方法时的警告;
    2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 
    3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
    4.path:在类路径、源文件路径等中有不存在的路径时的警告; 
    5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告; 
    6.finally:任何 finally 子句不能正常完成时的警告; 

    7.all:关于以上所有情况的警告。

学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:159610322   我们一起学Java!

以上がJava の深い理解: アノテーションの基本概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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