ホームページ >Java >&#&チュートリアル >Java の深い理解: アノテーションの基本概念
アノテーション(注釈)とは:
アノテーション(注釈)とは、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. 完全なアノテーション
1. JDK 組み込みシステム アノテーション
2メタ アノテーション
3. カスタム アノテーション
@Override: このメソッドを変更して親クラスのメソッドを上書きするために使用されます
@Deprecated: 廃止されたメソッドを変更するために使用されます
@SuppressWarnings: 通知するために使用されます。 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的成员赋值。实例如下:
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>
在这个例子中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 サイトの他の関連記事を参照してください。