匿名とは?
17037 ワード
匿名とは?
スプリングを使用してコードを記述する場合、@で始まる構文がよく見られます.通常、lombokを使用して@Getter、@Setterを特定のクラスに記述するだけで、クラスファイルの作成時にgetterとsetterを自動的に作成するのは便利だと思います.
申し訳ありませんが、Java 1.5から提供されているさまざまなアプリケーションを例に挙げて理解し、その具体的な用途を理解しました.
1.文法の概念
「アノテーション」(Annotation)は「メタデータ」(Metadata)とみなされます.メタデータは、アプリケーションが処理するデータではなく、コンパイルおよび実行時にコードの情報をどのようにコンパイルおよび処理するかです.宣言の形式は次のとおりです.
@AnnotationName
次の3つの目的で使用できます.
たとえば、親のメソッドを再定義する場合、コンパイル時に親タイプ(親、インタフェース)にメソッドが存在するかどうかを確認し、存在しない場合、コンパイルエラーが発生します.宣言は、構築時にXML設定ファイルを自動的に生成したり、配布のためにJARアーカイブを生成したりするために使用できます.また、実行時のクラスの役割も定義します.
2.構文定義
定義方法は、インタフェースの定義と同様です.
public @interface AnnotationName {
}
コードでは、このように定義された構文は次のように使用されます.@AnnotationName
クラスのフィールドのように、Ellimentという名前のやつはメンバーとして使用できます.各エンティティはタイプと名前で構成され、デフォルト値を持つことができます.元のタイプ(intまたはdoubleなど)、String、Classタイプ、およびそれらのタイルタイプを使用できます.public @interface AnnotationName{
// 엘리먼트 선언
String elementName1();
int elementName2() default 5;
}
この定義の構文をコードに適用する場合:@Annotation(elementName1 = "값", elementName2 = 3);
또는
@AnnotationName(elementName1 = "값");
elementName 1にはポーリング値がないため、この値を記述する必要があります.elementName 2にはポーリング値があるため、この値は省略できます.宣言はデフォルトの別名valueを持つことができます.
value別名を持つ構文をコードに適用する場合は、次の値のみが記述されます.
この値は、デフォルトの別名value値に自動的に設定されます.
@Annotation("값");
valueセグメントと他のセグメントの両方に値を指定する場合は、次の一般的な方法で指定できます.@AnnotationName(value = "값", elementName = 3);
3.適用範囲
ElementType列挙定数を適用するTypeクラス、インタフェース、列挙タイプANNOTATION TYPE FIELDフィールドCONTRUCTORジェネレータMETHODメソッドLOCAL VARIABLEローカル変数PACKAGEパッケージ
@Target
アプリケーションのターゲットを指定する場合は、@ターゲットプログラムを使用します.@Targetのデフォルト別名valueは、ElementType配列を値とします.これは、複数のターゲットを複数のターゲットに適用するように指定するためです.
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotatiionName{
}
保存の宣言
シナリオを定義する場合は、@AnnotationNameの使用範囲を指定して、追加する必要があります.簡単に言えば、ソースのみを保持するか、コンパイルされたクラスを保持するか、実行時にこれらのクラスを保持するかを指定する必要があります.構文保持ポリシーはjavaです.lang.annotation.保存ポリシー列挙定数は、次のように定義されます.
音声情報は、予約ポリシーリスト定数説明SOURCEソースにのみ保持されます.ソースコードを解析する場合にのみ意味があり、バイトコードファイルには情報が保持されません.CLASSバイトコードファイルも操作情報を保持します.ただし、返信を使用して関連情報を取得することはできません.RUNTIMEバイトコードファイルを保持しながら、レプリケーションを使用して実行時にインフレーション情報を取得できます.
「反射」(Reflection)とは、実行時にクラスのメタデータ情報を取得する機能です.たとえば、アプリケーションは、クラスが持つフィールドが何であるか、作成者が何であるか、メソッドが何であるか、および適用される構文を決定します.運転時に返信を使用して空気充填情報を取得するには、空気充填保持ボックスをRUNTIMEに設定する必要があります.保持ポリシーを指定する場合は、@保存宣言を使用します.
4.宣言の適用例コード
宣言と返信を使用して、簡単な例を作成します.次のPrintAnnotationでは、各メソッドの実行を分割線に分離し、コンソールに出力します.
@PrintAnnotation宣言
Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PrintAnnotation {
String value() default "-";
int number() default 15;
}
上記のコードでは、@Targetはメソッドにのみ適用され、@Reducationでは実行時に操作情報を保持できます.デフォルトの別名値は、区切り線で使用される文字で、numberは繰り返し出力の回数です.各数字には「-」と15が与えられています.以下はPrintAnnotationを適用するサービスクラスです.サービスクラス
public class Service {
@PrintAnnotation // 해당 어노테이션은 엘리먼트의 기본값으로 설정
public void method1(){
System.out.println("실행 내용1");
}
@PrintAnnotation("*") // 엘리먼트 value 값을 "*"로 설정
public void method2(){
System.out.println("실행 내용2");
}
@PrintAnnotation(value="#", number=20) // value 값을 "#", number 20 설정
public void method3(){
System.out.println("실행 내용3");
}
}
次のPrintAnnotationExampleクラスは、このアプリケーションを使用してサービスクラスに適用された説明情報を読み取り、文字と出力回数をコンソールに出力してメソッドを呼び出します.PrintAnnotationExampleクラス
public class PrintAnnotationExample {
public static void main(String[] args) {
//Service 클래스의 메소드 정보를 Method 배열로 리턴합니다.
Method[] declaredMethods = Service.class.getDeclaredMethods();
//메소드 객체를 하나씩 처리
for (Method method : declaredMethods) {
if (method.isAnnotationPresent(PrintAnnotation.class)) {
//객체 얻기
PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
//메소드 이름 출력
System.out.println("[" + method.getName() + "] ");
//구분선 출력
for (int i = 0; i < printAnnotation.number(); i++) {
System.out.print(printAnnotation.value());
}
System.out.println();
try {
method.invoke(new Service());
} catch (Exception e) {}
System.out.println();
}
}
}
}
上記のisAnnotationPresentメソッドは、クラス呼び出し時に親に適用されてもtrueを返しますが、指定した構文が適用されるかどうか.method.呼び出し(New Service)は、サービスオブジェクトを生成し、作成したサービスオブジェクトメソッドを呼び出すコードです.メソッドを呼び出すには、メモリにオブジェクトがあるだけです.
これらの文法の基本概念を理解し,@Getter文法を理解した後,以前は知らなかった内容をいくつか理解した.インターンシップを通じて、私は返事と確認にあまり深くありませんが、見えないところを知ることができて、とても満足しています.
Reference
この問題について(匿名とは?), 我々は、より多くの情報をここで見つけました https://velog.io/@sa1341/어노테이션이란テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol