Javaアノテーションインタビューの質問(回答)
1前書き
アノテーションはJava 5以降で出回っています、そして今日では、それらはコードを豊かにすることを可能にするユビキタスプログラミング構造です。
この記事では、注釈に関するいくつかの質問について説明します。それは技術面接でよく聞かれます。それらの答えをよりよく理解するために例を実装します。
2.質問
Q1. 注釈とはそれらの典型的なユースケースは何ですか?
注釈はプログラムのソースコードの要素に結び付けられたメタデータであり、それらが動作するコードの動作には影響しません。
その典型的なユースケースは次のとおりです。
-
コンパイラに関する情報
– 注釈を付けると、コンパイラは
エラーを検出するか警告を抑制します
コンパイル時および展開時の処理** – ソフトウェアツール
注釈を処理し、コード、設定ファイルなどを生成する
-
実行時処理
– 注釈は実行時に調べて
プログラムの振る舞いをカスタマイズする
** Q2. 標準ライブラリから有用な注釈をいくつか説明してください.
java.lang
および
java.lang.annotation
パッケージにはいくつかのアノテーションがありますが、より一般的なものには以下が含まれますが、これらに限定されません。
-
@ Override –
は、メソッドが要素をオーバーライドすることを意図していることを示します。
スーパークラスで宣言されています。メソッドを正しくオーバーライドできない場合は、
コンパイラはエラーを発行します
**
@ Deprecated
– 要素が非推奨であり、そうではないことを示します。
中古。プログラムがメソッドを使用すると、コンパイラは警告を出します。
このアノテーションでマークされたクラスまたはフィールド
**
@ SuppressWarnings
– 特定の文字列を非表示にするようコンパイラーに指示します。
警告書かれたレガシーコードとインターフェースするときに最も一般的に使用されます
ジェネリック医薬品が登場する前
**
@ FunctionalInterface
– Java 8で導入された、タイプを示す
宣言は機能的なインタフェースであり、その実装はラムダ式を使って提供することができます
Q3. どのようにして注釈を作成できますか?
注釈は、キーワード
interface
の前に
@、
が付き、その本体にはメソッドと非常によく似た
注釈型のelement
宣言が含まれるインタフェースの形式です。
public @interface SimpleAnnotation {
String value();
int[]types();
}
アノテーションが定義された後、yonはあなたのコードを通してそれを使い始めることができます:
@SimpleAnnotation(value = "an element", types = 1)
public class Element {
@SimpleAnnotation(value = "an attribute", types = { 1, 2 })
public Element nextElement;
}
配列要素に複数の値を指定する場合は、それらを大括弧で囲む必要があります。
オプションで、デフォルト値がコンパイラに対する定数式である限り、デフォルト値を指定できます。
public @interface SimpleAnnotation {
String value() default "This is an element";
int[]types() default { 1, 2, 3 };
}
これで、これらの要素なしで注釈を使用できます。
@SimpleAnnotation
public class Element {
//...
}
またはそれらのうちのいくつかだけ:
@SimpleAnnotation(value = "an attribute")
public Element nextElement;
Q4. アノテーションメソッド宣言からどんなオブジェクトタイプが返されることができますか?
戻り型は、
String
、
Class
、
Enum
のいずれかのプリミティブ、または上記のいずれかの型の配列でなければなりません。それ以外の場合、コンパイラはエラーをスローします。
この原則に従うコードの例を次に示します。
enum Complexity {
LOW, HIGH
}
public @interface ComplexAnnotation {
Class<? extends Object> value();
int[]types();
Complexity complexity();
}
Object
は有効な戻り型ではないため、次の例ではコンパイルに失敗します。
public @interface FailingAnnotation {
Object complexity();
}
Q5. どのプログラム要素に注釈を付けることができますか?
注釈は、ソースコード全体のいくつかの場所に適用できます。
それらはクラス、コンストラクタ、およびフィールドの宣言に適用できます。
@SimpleAnnotation
public class Apply {
@SimpleAnnotation
private String aField;
@SimpleAnnotation
public Apply() {
//...
}
}
メソッドとそのパラメータ
@SimpleAnnotation
public void aMethod(@SimpleAnnotation String param) {
//...
}
ループやリソース変数を含むローカル変数
@SimpleAnnotation
int i = 10;
for (@SimpleAnnotation int j = 0; j < i; j++) {
//...
}
try (@SimpleAnnotation FileWriter writer = getWriter()) {
//...
} catch (Exception ex) {
//...
}
その他の注釈の種類
@SimpleAnnotation
public @interface ComplexAnnotation {
//...
}
そして
package-info.java
ファイルを通したパッケージでさえも:
@PackageAnnotation
package com.baeldung.interview.annotations;
Java 8では、それらは型の
use
にも適用できます。これが機能するためには、アノテーションは
ElementType.USE
の値で
@ Target
アノテーションを指定しなければなりません:
@Target(ElementType.TYPE__USE)
public @interface SimpleAnnotation {
//...
}
これで、アノテーションをクラスインスタンスの作成に適用できます。
new @SimpleAnnotation Apply();
型キャスト:
aString = (@SimpleAnnotation String) something;
Implements句:
public class SimpleList<T>
implements @SimpleAnnotation List<@SimpleAnnotation T> {
//...
}
そして
throws
句:
void aMethod() throws @SimpleAnnotation Exception {
//...
}
Q6. 注釈を適用できる要素を制限する方法はありますか?
はい、
@ Target
アノテーションをこの目的に使用できます。適用できない文脈で注釈を使用しようとすると、コンパイラはエラーを発行します。
これは、
@ SimpleAnnotation
アノテーションの使用をフィールド宣言のみに限定する例です。
@Target(ElementType.FIELD)
public @interface SimpleAnnotation {
//...
}
より多くのコンテキストで適用可能にしたい場合は、複数の定数を渡すことができます。
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE })
注釈をつけることさえできるので、それを何にも注釈を付けるために使用することはできません。宣言された型が複雑な注釈のメンバ型としての使用のみを目的としている場合に便利です。
@Target({})
public @interface NoTargetAnnotation {
//...
}
Q7. メタアノテーションとは何ですか?
他の注釈に適用される注釈です。
@ Target、
でマークされていない、または
ANNOTATION
TYPE__定数を含むすべてのアノテーションもメタアノテーションです。
@Target(ElementType.ANNOTATION__TYPE)
public @interface SimpleAnnotation {
//...
}
Q8. 繰り返し注釈とは何ですか?
これらは、同じ要素宣言に複数回適用できる注釈です。
互換性の理由から、この機能はJava 8で導入されたので、繰り返しアノテーションはJavaコンパイラによって自動的に生成される
コンテナアノテーション
に格納されます。コンパイラがこれを行うには、それらを宣言するための2つのステップがあります。
まず、繰り返し可能な注釈を宣言する必要があります。
@Repeatable(Schedules.class)
public @interface Schedule {
String time() default "morning";
}
次に、必須の
value
要素を使用して包含注釈を定義し、その型は繰り返し可能な注釈型の配列でなければなりません。
public @interface Schedules {
Schedule[]value();
}
さて、@Scheduleを複数回使用することができます。
@Schedule
@Schedule(time = "afternoon")
@Schedule(time = "night")
void scheduledMethod() {
//...
}
Q9. 注釈を取得する方法これはその保存方針とどのように関連していますか?
注釈を取得するには、Reflection APIまたは注釈プロセッサを使用できます。
@ Retention
アノテーションとその
RetentionPolicy
パラメーターは、それらを取得する方法に影響します。
RetentionPolicy
enumには3つの定数があります。
-
RetentionPolicy.SOURCE
– アノテーションを
コンパイラだが注釈プロセッサはそれらを読むことができる
**
RetentionPolicy.CLASS
– 注釈がに追加されることを示します
クラスファイルだがリフレクションではアクセスできない
**
RetentionPolicy.RUNTIME
– 注釈はクラスファイルに記録されます
それらは内省的に読むことができるようにコンパイラによってそして実行時にJVMによって保持されます
これは、実行時に読み取ることができる注釈を作成するためのコード例です。
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
String value();
}
これで、注釈はリフレクションを通じて取得できます。
Description description
= AnnotatedClass.class.getAnnotation(Description.class);
System.out.println(description.value());
アノテーションプロセッサは
RetentionPolicy.SOURCE
で動作します。これは記事リンク:/java-annotation-processing-builder[Javaアノテーション処理とビルダーの作成]で説明されています。
RetentionPolicy.CLASS
は、Javaバイトコードパーサーを書くときに使用できます。
Q10. 次のコードはコンパイルされますか?
@Target({ ElementType.FIELD, ElementType.TYPE, ElementType.FIELD })
public @interface TestAnnotation {
int[]value() default {};
}
いいえ、同じ列挙型定数が
@ Target
アノテーションに複数回現れると、コンパイル時エラーとなります。
重複した定数を削除すると、コードは正常にコンパイルされます。
@Target({ ElementType.FIELD, ElementType.TYPE})
Q11. 注釈を拡張することは可能ですか?
Java言語
に記載されているように、注釈は常に__java.lang.annotation.Annotationを拡張したものです。仕様]。
注釈宣言で
extends
句を使用しようとすると、コンパイルエラーが発生します。
public @interface AnAnnotation extends OtherAnnotation {
//Compilation error
}
結論
この記事では、アノテーションに関して、Java開発者向けの技術面接でよく寄せられる質問について説明しました。これは決して網羅的なリストではありません、そしてそれ以上の研究の開始として考慮されるべきです。
Baeldungでは、今後のインタビューであなたが成功することを願っています。
次
”
https://www.baeldung.com/spring-interview-questions【Top
Spring Frameworkのインタビューの質問】
-
«** 前へ