주석을 만드는 것은 일부 규칙에 의해 제한되기는 하지만 매우 간단한 프로세스입니다. 이제 우리는 그들이 제공하는 실질적인 목적을 파악해야 합니다.

자신만의 주석을 만드는 방법을 기억해 봅시다.

우리는 클래스와 메소드에 대한 주석을 작성하고 코드 작성자와 버전에 대한 정보를 포함합니다.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

주석을 추가한 클래스는 다음과 같습니다.

@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}

@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}

@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}

런타임에 이 데이터를 어떻게 사용할 수 있습니까?

리플렉션을 사용하여 주석에서 메타데이터를 추출합니다. 반사가 무엇인지 기억하십시오. 리플렉션은 런타임에 프로그램에 대한 데이터를 검사하는 메커니즘입니다. 리플렉션을 사용하면 필드, 메서드, 클래스 생성자 및 클래스에 대한 정보를 얻을 수 있습니다.

리플렉션을 사용하여 클래스의 주석을 읽고 원하는 정보를 표시합니다.

기본 메서드 에서 클래스의 데이터를 읽습니다 .

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;

public class Main {
   public static void main(String[] args) throws NoSuchMethodException {
       readMyClass(MyClass1.class);
       readMyClass(MyClass2.class);
       readMyClass(MyClass3.class);
   }

   static void readMyClass(Class<?> myClassObj) throws NoSuchMethodException {
       System.out.println("\nClass: " + myClassObj.getName());
       readAnnotation(myClassObj);
       Method method = myClassObj.getMethod("myClassMethod");
       readAnnotation(method);
   }

   static void readAnnotation(AnnotatedElement element) {
       try {
           System.out.println("Search for annotations in " + element.getClass().getName());
           Annotation[] annotations = element.getAnnotations();
           for (Annotation annotation : annotations) {
               if (annotation instanceof Info) {
                   final Info fileInfo = (Info) annotation;
                   System.out.println("Author: " + fileInfo.author());
                   System.out.println("Version: " + fileInfo.version());
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

클래스의 인스턴스를 readMyClass 메서드에 전달합니다.

그런 다음 클래스와 메서드를 readAnnotation 메서드에 전달할 수 있습니다. 그렇게 합시다. Class 객체와 Method 객체를 전달하겠습니다. AnnotatedElement 인터페이스를 구현하는 개체를 사용합니다 . 이를 통해 개체에서 주석 목록을 가져오고 각각에 대한 정보를 얻을 수 있습니다.

주석이 주석 유형인 if (annotation instanceof Info) 에 속하는지 확인한 후에만 정보를 얻습니다 .

프로그램 출력은 주석에서 완전한 정보를 제공합니다.

클래스: annotation.MyClass1
java.lang.Class에서 주석 검색
작성자: 작성자
버전: 0.0
java.lang.reflect.Method에서 주석 검색
저자: 작성자
버전: 0.0

클래스: annotation.MyClass2
java.lang에서 주석 검색. 클래스
작성자: 작성자
버전: 2.0
java.lang.reflect.Method에서 주석 검색
작성자: 익명
버전: 0.0

클래스: annotation.MyClass3
java.lang.Class에서 주석 검색
작성자: 익명
버전: 2.0
자바에서 주석 검색. lang.reflect.Method
작성자: 익명
버전: 4.0

따라서 리플렉션의 도움으로 메타데이터를 추출할 수 있었습니다.

이제 일반적인 가독성, 속도 및 품질 향상을 포함하여 주석을 사용하여 코드를 개선하는 예를 살펴보겠습니다. Lombok이 이를 도와줄 것입니다.

Lombok은 주석을 사용하여 막대한 양의 코드를 숨기고 언어를 확장하여 개발을 단순화하고 일부 기능을 추가하는 컴파일러 플러그인입니다.

Lombok의 주석 예제를 고려하십시오.

@ToString 객체의 완전한 표현(클래스 이름, 모든 필드 및 해당 값)으로 구성된 toString() 메서드 의 구현을 생성합니다 .
@ToString
public class Example
@EqualsAndHashCode 기본적으로 비정적 및 비정적 필드를 사용하지만 구성 가능한 equalshashCode 의 구현을 생성합니다 . 자세한 내용은 프로젝트 웹사이트 에서 확인할 수 있습니다 . 여기에서 @EqualsAndHashCode를 사용 하고 주석이 없는 표준 구현을 보여주는 예제를 찾을 수 있습니다 .
@Getter / @Setter 개인 필드에 대한 getter 및 setter를 생성합니다.
@Getter
@Setter
private String name = "name";
@NonNull 개체가 인스턴스화될 때 필드가 null이 아님을 어설션하는 데 사용됩니다. 그렇지 않으면 NullPointerException 이 발생합니다.
public Example(@NonNull P p) {
 super("Hello");
 this.name = p.getName();
}

Lombok에는 덜 자주 사용되는 더 많은 유용한 주석이 있습니다. 가장 간단한 주석을 고려했습니다. 공식 웹 사이트 에서 프로젝트에 대한 자세한 내용을 읽을 수 있습니다 .