Java : AnnotatedElement - API使用例

AnnotatedElement (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

このVMで現在実行されているプログラムの注釈付きコンストラクトを表します。 コンストラクトは要素または型のどちらかです。 要素の注釈は宣言に置かれ、型の注釈は型名の特定の使用に置かれます。

クラス構成

AnnotatedElement は、クラスやメソッド、フィールドなどからアノテーションを取得するためのインタフェースです。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Foo {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Bar {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Baz {
}

@Foo
class A {
    @Bar
    int num;

    @Baz
    void aaa() {
    }
}
final AnnotatedElement element = A.class;

final var foo = element.getDeclaredAnnotation(Foo.class);
System.out.println(foo); // @Foo()
final AnnotatedElement element = A.class.getDeclaredField("num");

final var bar = element.getDeclaredAnnotation(Bar.class);
System.out.println(bar); // @Bar()
final AnnotatedElement element = A.class.getDeclaredMethod("aaa");

final var bar = element.getDeclaredAnnotation(Baz.class);
System.out.println(bar); // @Baz()

メソッド

<T extends Annotation> T getAnnotation (Class<T> annotationClass)

存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@interface Foo {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Bar {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Baz {
}

@Foo
class A {
}

@Bar
class B extends A {
    @Baz
    int num;
}
final AnnotatedElement element = B.class;

final var ret1 = element.getAnnotation(Foo.class);
System.out.println(ret1); // @Foo()

final var ret2 = element.getDeclaredAnnotation(Foo.class);
System.out.println(ret2); // null
final AnnotatedElement element = B.class;

final var ret1 = element.getAnnotation(Bar.class);
System.out.println(ret1); // @Bar()

final var ret2 = element.getDeclaredAnnotation(Bar.class);
System.out.println(ret2); // @Bar()
final AnnotatedElement element = B.class.getDeclaredField("num");

final var ret1 = element.getAnnotation(Baz.class);
System.out.println(ret1); // @Baz()

final var ret2 = element.getDeclaredAnnotation(Baz.class);
System.out.println(ret2); // @Baz()

Annotation[] getAnnotations ()

この要素に存在する注釈を返します。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@interface Foo {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Bar {
}

@Foo
class A {
}

@Bar
class B extends A {
}
final AnnotatedElement element = B.class;

for (final var a : element.getAnnotations()) {
    System.out.println(a);
}

// 結果
// ↓
//@Foo()
//@Bar()
final AnnotatedElement element = B.class;

for (final var a : element.getDeclaredAnnotations()) {
    System.out.println(a);
}

// 結果
// ↓
//@Bar()

default <T extends Annotation> T[] getAnnotationsByType (Class<T> annotationClass)

この要素に関連付けられている注釈を返します。

@Repeatable(FooArray.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@interface Foo {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@interface FooArray {
    Foo[] value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Bar {
}

@Foo("a1")
@Foo("a2")
class A {
}

@Bar
class B extends A {
}
final AnnotatedElement element = B.class;

System.out.println("-- Foo --");
for (final var a : element.getAnnotationsByType(Foo.class)) {
    System.out.println(a.annotationType().getSimpleName() + " : " + a.value());
}

System.out.println("-- Bar --");
for (final var a : element.getAnnotationsByType(Bar.class)) {
    System.out.println(a.annotationType().getSimpleName());
}

System.out.println("-- end --");

// 結果
// ↓
//-- Foo --
//Foo : a1
//Foo : a2
//-- Bar --
//Bar
//-- end --
final AnnotatedElement element = B.class;

System.out.println("-- Foo --");
for (final var a : element.getDeclaredAnnotationsByType(Foo.class)) {
    System.out.println(a.annotationType().getSimpleName() + " : " + a.value());
}

System.out.println("-- Bar --");
for (final var a : element.getDeclaredAnnotationsByType(Bar.class)) {
    System.out.println(a.annotationType().getSimpleName());
}

System.out.println("-- end --");

// 結果
// ↓
//-- Foo --
//-- Bar --
//Bar
//-- end --

default <T extends Annotation> T getDeclaredAnnotation (Class<T> annotationClass)

直接存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。

このメソッドの使用例は、getAnnotation(Class<T> annotationClass) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

Annotation[] getDeclaredAnnotations ()

この要素に直接存在する注釈を返します。

このメソッドの使用例は、getAnnotations() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

default <T extends Annotation> T[] getDeclaredAnnotationsByType (Class<T> annotationClass)

直接存在するか間接的に存在する場合は、この要素の指定された型の注釈を返します。

このメソッドの使用例は、getAnnotationsByType(Class<T> annotationClass) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

default boolean isAnnotationPresent (Class<? extends Annotation> annotationClass)

指定された型の注釈がこの要素に存在する場合はtrueを返し、そうでない場合はfalseを返します。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Foo {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Bar {
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Baz {
}

@Foo
class A {
    @Bar
    int num;

    @Baz
    void aaa() {
    }
}
final AnnotatedElement element = A.class;

System.out.println(element.isAnnotationPresent(Foo.class)); // true
System.out.println(element.isAnnotationPresent(Bar.class)); // false
System.out.println(element.isAnnotationPresent(Baz.class)); // false
final AnnotatedElement element = A.class.getDeclaredField("num");

System.out.println(element.isAnnotationPresent(Foo.class)); // false
System.out.println(element.isAnnotationPresent(Bar.class)); // true
System.out.println(element.isAnnotationPresent(Baz.class)); // false
final AnnotatedElement element = A.class.getDeclaredMethod("aaa");

System.out.println(element.isAnnotationPresent(Foo.class)); // false
System.out.println(element.isAnnotationPresent(Bar.class)); // false
System.out.println(element.isAnnotationPresent(Baz.class)); // true

関連記事

ページの先頭へ