Programmingバックエンド開発者

Javaにおけるアノテーションのサポートがどのように実装されているか、自分自身のカスタムアノテーションを作成する方法について説明してください。実際にどのように使用するのが正しいのかも教えてください。

Hintsage AIアシスタントで面接を突破

答え。

問題の歴史:

アノテーションはJava 5で導入され、プログラムのロジックを変更せずにバイトコードにメタ情報を追加するためのものです。アノテーションを使用することで、クラスやメソッドにフレームワークやコンパイラ、パーサー用の追加情報を簡単に提供できます。

問題:

設計が不十分なアノテーションや誤って使用されたアノテーションは、コードの保守を複雑にします。時折、開発者はアノテーションの適用可能性を混同したり、自分のアノテーションを作成する方法が分からなかったり、パラメータ付きのアノテーションを作成する可能性を理解できなかったりします。

解決策:

自分のアノテーションを作成する:

import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTest { String value() default ""; }

アノテーションの使用:

public class TestClass { @MyTest("Example") public void testMethod() {...} }

主な特徴:

  • アノテーションはデフォルト値を持つパラメータを持つことができます
  • アノテーションは@Targetおよび@Retentionのメタアノテーションで装飾される必要があります
  • Runtime Retentionを使用することで、リフレクションを通じてアノテーションを使用できます

騙しの質問。

アノテーションは他のアノテーションから継承できますか?

答え: いいえ、Javaのアノテーションは互いに継承をサポートしていません。

アノテーションの動作をクラスのすべての子孫に義務付けることはできますか?

答え: 直接にはできません。リフレクションを使用してアノテーションの存在をチェックし、その制御を手動で実装する必要があります。

@Retention(Class)と@Retention(RUNTIME)の違いは何ですか?

答え:

  • @Retention(RUNTIME): アノテーションはリフレクションを通じて実行時にアクセス可能です
  • @Retention(CLASS): アノテーションはバイトコードに保存されますが、リフレクションを通じてはアクセスできません(コンパイラのみが使用)

タイプミスとアンチパターン

  • 自分のアノテーションに@Targetと@Retentionを指定しない
  • アノテーションを目的に合わない形で使用する(たとえば、適切なツールで処理しなかったり、指定された環境外で使用する)

実際の例

ネガティブケース

プロジェクトでXMLによる設定をアノテーションに置き換えましたが、@Retention(RUNTIME)を追加しませんでした。

利点:

  • コードがコンパクトに見えるようになりました

欠点:

  • アノテーションがランタイムで見えないため、フレームワークがそれを処理できません

ポジティブケース

ビジネスオペレーションの監査を制御するカスタムアノテーション@Auditをメソッドに設定し、サーバー上でのロジックの実際の呼び出しにリフレクションを使用しました。

利点:

  • 中央集権的で透明な監査

欠点:

  • アノテーションの処理には若干のランタイムオーバーヘッドと、ループの例外処理を考慮する必要があります。