注釈とは何ですか
アノテーションは新しいデータ型で、インターフェイスに非常に似ており、クラス、インターフェイス、列挙と同じレベルにあります。
@ で始まるマークに相当し、クラス、プロパティ、メソッド、パラメータなどの先頭を宣言できます。要素の特定の機能を記述、ラベル付け、実装するために使用されます。
機能:
1. ドキュメントの作成: アノテーションに従ってドキュメントを生成します
。 2. コード分析: アノテーションによるリフレクションを使用してコードを分析します。
3. コンパイル検査: コンパイラーがオーバーライドなどのアノテーションを通じて基本的な型チェックを実装できるようにします。
JDK の事前定義されたアノテーション
java.lang パッケージ内
注釈 | 効果 |
---|---|
@オーバーライド | メソッドの前で、親クラスのメソッドをオーバーライドします。 |
@非推奨 | クラス、属性、メソッドの前にある場合は、時代遅れで推奨されないことを意味します |
@SuppressWarning | クラス、属性、メソッドの前では、警告メッセージを閉じることを意味します。 |
package cn.xxx.annotation;
import java.util.Date;
@SuppressWarnings("all")
public class AnnoDemo2 {
@Override
public String toString() {
return super.toString();
}
@Deprecated//过期注解
public void show1(){
//有缺陷
}
public void show2(){
//替代show1方法
}
public void demo(){
show1();
Date date = new Date();
}
}
カスタム注釈
@interface
+ メタアノテーションの使用
// 元注解
public @interface 注解名 {
// 抽象方法或者叫属性列表
}
メタアノテーション: アノテーションにタグ付けされたアノテーション
メタアノテーション | 効果 |
---|---|
@目標 | アノテーションの範囲、つまりクラスやメソッドなど、どの要素にマークを付けることができるかを定義します。省略した場合は、任意の要素の前に置くことができます |
@保持 | アノテーションのライフサイクルを定義します。SOURCE、CLASS、RUNTIME、コンパイル時に保持、クラスに保持、通常は RUNTIME を使用します。 |
@文書化されました | javadocを使用してドキュメントを生成するときにアノテーションを含めるかどうか |
@継承 | サブクラスが親クラスのアノテーションを継承できるようにする |
アノテーションは最終的に次のようにコンパイルされます。
public interface MyAnno extends java.lang.annotation.Annotation {
}
したがって、アノテーションの本質はインターフェースであり、デフォルトでアノテーションインターフェースを継承します。
package cn.xxx.annotation;
import java.lang.annotation.*;
@Target({
ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno3 {
}
注釈を使用する
文法:
@注解名(属性名=属性值,属性名=属性值)
- アノテーションを使用する場合、アノテーションで抽象メソッドの戻り値を指定する必要があります。これは、アノテーションのプロパティ値の指定とも呼ばれます。
- 属性名は、アノテーション内の抽象メソッドの名前です。
package cn.xxx.annotation;
public @interface MyAnno {
int value();
Person per();
MyAnno2 anno2();
String[] strs();
/*String name() default "张三";*/
/*String show2();
Person per();
MyAnno2 anno2();
String[] strs();*/
}
package cn.xxx.annotation;
@MyAnno(value=12,per = Person.P3,anno2 = @MyAnno2,strs={
"bbb","aaa"})
@MyAnno3
public class Worker {
@MyAnno3
public String name = "aaa";
@MyAnno3
public void show () {
}
}
注釈の解析
ライフサイクルが RUNTIME であるアノテーションの場合。アノテーションの解析とは、アノテーションに定義されている属性値を取得することです。次の 3 つのステップがあります。
- アノテーションで定義された場所(クラス、メソッド、フィールド)のオブジェクトを取得します
- 指定されたアノテーションを取得する
- getAnnotation(クラス)
//其实就是在内存中生成了一个该注解接口的子类实现对象 public class ProImpl implements Pro{ public String className(){ return "cn.itcast.annotation.Demo1"; } public String methodName(){ return "show"; } }
- アノテーション内の抽象メソッドを呼び出して、構成された属性値を取得します。
例:
// 1、获取类上的注解
Class cls = Student.class;
// 2、获取该类Student上的所有注解,不一定获取类上的注解,也可以获取方法上的注解,这时候就是 `method.getAnnotation()`
Annotation[] annotation = cls.getAnnotations();
// 仅获取该类上的Pro注解
Pro annotation = cls.getAnnotation(Pro.class);
// 3、获取注解上的属性方法
String className = annotation.className() // cn.xxx.annotation.Demo1
String className = annotation.methodName() // show
...
要約する
アノテーションとはラベルのようなもので、例えば関数にCheckアノテーションを付けるとその関数がチェック可能であることを意味し、対応するチェックプログラムはCheckアノテーションを認識して対応するプログラムを実行することができます。チェックプログラムがない場合、注釈自体は意味がありません。単なるコメントのようなものです。
1. ほとんどの場合、カスタム アノテーションではなく、アノテーションのみが使用されます
。1. コンパイラー 2. プログラムの解析
3. アノテーションはプログラムの一部ではなく、ラベルのようなもの