jdk8 のアノテーションの新機能:
1. 繰り返し可能な注釈
2. 注釈を入力する
1: 繰り返し可能な注釈
重複したアノテーションとは何ですか? 書き換え可能な注釈。
例えば:
注釈:
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {
String value() default "hello";
}
使用:
@MyAnnotation(value = "hi")
@MyAnnotation(value = "abc")
class Person {
}
しかし、このように書いてもほとんど意味がありません。まだいくつかの設定を行う必要があります。
jdk8より前に書かれたもの
MyAntation 配列を作成する
public @interface MyAnnotations {
MyAnnotation[] value();
}
使用:
@MyAnnotations({@MyAnnotation(value = "hi"),@MyAnnotation(value = "abc")})
class Person {
}
jdk8以降
アノテーション @Repeatable() をアノテーション MyAntation に導入します:repeatable
次のように MyAntation に注釈を付けます
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {
String value() default "hello";
}
MyAnnotations アノテーション内の宣言サイクルと変更可能な構造は、MyAnnotation アノテーション内の宣言サイクルと変更可能な構造と一致している必要があります。
MyAnnotations に注釈を付ける:
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {
MyAnnotation[] value();
}
使用:
@MyAnnotation(value = "hi")
@MyAnnotation(value = "abc")
class Person {
}
2: 型アノテーション
Java 8 以前: アノテーションは宣言内でのみ使用できます。
Java8 以降、アノテーションはどこにでも適用できるようになりました。
ElementType.TYPE_PARAMETERは、型変数の宣言文(例:ジェネリック宣言)にアノテーションを記述できることを示します。
ElementType.TYPE_USE は、その型を使用する任意のステートメントに注釈を記述できることを示します。
1.ElementType.TYPE_PARAMETER 使用:
class Generic<@MyAnnotation T>{
}
ただしこの時点ではエラーが報告されるので、MyAnnotation で利用可能な型に TYPE_PARAMETER を追加します。
注釈 MyAnnotation:
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER})
public @interface MyAnnotation {
String value() default "hello";
}
概要: ① MyAnnotation の @Repeatable メンバー値を MyAnnotations.class として宣言します。
② MyAnnotationのTargetやRetentionなどのメタアノテーションはMyAnnotationsと同じ
2.要素タイプ.TYPE_USE
上記と同様に、MyAnnotationで使用できる型にElementType.TYPE_USEを追加します。
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
String value() default "hello";
}
使用:
class Generic<@MyAnnotation T>{
public void show() throws @MyAnnotation RuntimeException{
ArrayList<@MyAnnotation String> list = new ArrayList<>();
int num = (@MyAnnotation int) 10L;
}
}
見てくれてありがとう!!!