0Pricing
Java Academy · レッスン

実行時のアノテーション処理

リフレクションで実行時にアノテーションを読み取り、検証、ルーティング、インジェクションのロジックを実装します。

「実行時のアノテーション処理」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

クラスレベルのアノテーションの読み取り

クラスのアノテーションは、単一のアノテーションには Class.getAnnotation()、すべてのアノテーションには getAnnotations() を使用して取得します。アノテーションがない場合は null を返します。

@Service
@RequestMapping("/api")
public class UserController {}

RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println(Arrays.toString(rm.value())); // ["/api"]

メソッドアノテーションの読み取り

メソッドのアノテーションは method.getAnnotation() で取得します。クラス内のすべてのメソッドを調べるには、getDeclaredMethods() を反復処理します。

for (Method m : UserController.class.getDeclaredMethods()) {
    GetMapping gm = m.getAnnotation(GetMapping.class);
    if (gm != null) System.out.println(m.getName() + " -> " + Arrays.toString(gm.value()));
}

フィールドアノテーションの読み取り

フィールドアノテーションは、バリデーションや ORM フレームワークで使用されます。getDeclaredFields() を反復処理し、必要な各アノテーションの有無を確認します。

for (Field f : User.class.getDeclaredFields()) {
    Column col = f.getAnnotation(Column.class);
    if (col != null) System.out.println(f.getName() + " -> column: " + col.name());
}

パラメータアノテーションの読み取り

パラメータアノテーションは method.getParameterAnnotations() で取得できます。これは2次元配列で、パラメータごとに1行、その行にアノテーションが1つずつ格納されます。

Method m = UserController.class.getDeclaredMethod("create", UserDto.class);
Annotation[][] pa = m.getParameterAnnotations();
for (Annotation a : pa[0]) System.out.println(a.annotationType().getSimpleName()); // e.g. Valid

isAnnotationPresent

アノテーションの値を読み取る前に、isAnnotationPresent(AnnotationType.class) を使うと、null 安全に素早く有無を確認できます。

if (m.isAnnotationPresent(Transactional.class)) {
    beginTransaction();
    m.invoke(target, args);
    commitTransaction();
}

シンプルな依存性注入コンテナの構築

@Component が付いたクラスをパッケージから走査し、リフレクションでインスタンス化してマップに格納します。簡略化した Spring コンテナの例です。

Map<Class<?>, Object> beans = new HashMap<>();
for (Class<?> cls : scanPackage("com.example")) {
    if (cls.isAnnotationPresent(Component.class)) {
        beans.put(cls, cls.getDeclaredConstructor().newInstance());
    }
}

@Inject が付いたフィールドへの注入

Bean を構築した後、@Inject が付いたフィールドを走査し、リフレクションを使って値を設定します。フィールドインジェクションを再現する処理です。

for (Object bean : beans.values()) {
    for (Field f : bean.getClass().getDeclaredFields()) {
        if (f.isAnnotationPresent(Inject.class)) {
            f.setAccessible(true);
            f.set(bean, beans.get(f.getType()));
        }
    }
}

アノテーションの値を使った実行時バリデーション

@Range(min=1, max=100) のような制約アノテーションの値を読み取り、実行時にフィールドの値がその制約を満たすか検証します。

for (Field f : dto.getClass().getDeclaredFields()) {
    Range range = f.getAnnotation(Range.class);
    if (range != null) {
        f.setAccessible(true);
        int val = (int) f.get(dto);
        if (val < range.min() || val > range.max())
            throw new ValidationException(f.getName() + " out of range");
    }
}

反復可能なアノテーションの読み取り

@Repeatable アノテーションの場合は、getAnnotationsByType() を使うと、コンテナアノテーションに格納されたすべてのインスタンスを透過的に取得できます。

Tag[] tags = MyClass.class.getAnnotationsByType(Tag.class);
for (Tag t : tags) System.out.println(t.value());

ClassPath ライブラリを使ったパッケージの走査

標準の Java リフレクションでは、パッケージ内のすべてのクラスを列挙できません。Reflections、ClassGraph、Spring の ClassPathScanningCandidateComponentProvider などのライブラリを使って、クラスパスのエントリを走査します。

Reflections reflections = new Reflections("com.example.service");
Set<Class<?>> services = reflections.getTypesAnnotatedWith(Service.class);
services.forEach(System.out::println);

実行時のアノテーション処理: まとめ

実行時のアノテーション処理は、依存性注入、バリデーション、ルーティング、ORM を支えています。これは初期化時に行う処理です。起動時にアノテーションを一度だけ処理して結果をキャッシュし、リクエストごとの処理経路でのリフレクションを避けます。

確認問題

@Repeatable アノテーションのすべてのインスタンスを取得するメソッドはどれですか。

まとめ

単一のアノテーションには getAnnotation と isAnnotationPresent を使用します。getDeclared* でメソッドやフィールドを走査します。反復可能なアノテーションには getAnnotationsByType を使用します。起動時に処理して結果をキャッシュしましょう。

よくある質問

「実行時のアノテーション処理」レッスンは無料ですか?

はい。「実行時のアノテーション処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「実行時のアノテーション処理」で何を学びますか?

リフレクションで実行時にアノテーションを読み取り、検証、ルーティング、インジェクションのロジックを実装します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「実行時のアノテーション処理」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. アノテーションの定義:要素とデフォルト値
  2. 保持ポリシーと対象型
  3. 実行時のアノテーション処理
  4. コンパイル時アノテーションプロセッサー
← Java Academyに戻る