匿名とは?


匿名とは?


スプリングを使用してコードを記述する場合、@で始まる構文がよく見られます.通常、lombokを使用して@Getter、@Setterを特定のクラスに記述するだけで、クラスファイルの作成時にgetterとsetterを自動的に作成するのは便利だと思います.
申し訳ありませんが、Java 1.5から提供されているさまざまなアプリケーションを例に挙げて理解し、その具体的な用途を理解しました.

1.文法の概念


「アノテーション」(Annotation)は「メタデータ」(Metadata)とみなされます.メタデータは、アプリケーションが処理するデータではなく、コンパイルおよび実行時にコードの情報をどのようにコンパイルおよび処理するかです.宣言の形式は次のとおりです.
@AnnotationName
次の3つの目的で使用できます.
  • コンパイラにコード構文エラーをチェックする情報を提供します.
  • ソフトウェア開発ツールは、構築または展開時にコードを自動的に生成する情報を提供する.
  • ランタイム(ランタイム)は、特定の機能を実行するための情報を提供する.
  • コンパイラにコード構文エラー情報をチェックする最初の例は@override宣言です.
    たとえば、親のメソッドを再定義する場合、コンパイル時に親タイプ(親、インタフェース)にメソッドが存在するかどうかを確認し、存在しない場合、コンパイルエラーが発生します.宣言は、構築時に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文法を理解した後,以前は知らなかった内容をいくつか理解した.インターンシップを通じて、私は返事と確認にあまり深くありませんが、見えないところを知ることができて、とても満足しています.