반응형

애노테이션 관련 두 가지 큰 변화

  • 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨.
  • 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨.

 

타입 선언 부

  • 제네릭 타입
  • 변수 타입
  • 매개변수 타입
  • 예외 타입
  • ...

 

@Target 설정

타입에 애노테이션을 사용하기 위해 아래와 같은 설정을 한다.

  • TYPE_PARAMETER: 타입 변수에만 사용할 수 있다.
  • TYPE_USE: 타입 변수를 포함해서 모든 타입 선언부에 사용할 수 있다.

 

중복 사용할 수 있는 애노테이션을 만들기

  • 중복 사용할 애노테이션 만들기
    • @Chicken
    • Chicken.java (중복 사용할 애노테이션)
/*
    @Target(ElementType.TYPE_PARAMETER)
     - 제네릭을 사용할 때 타입 변수앞에 애노테이션을 사용할 수 있다.
    @Target(ElementType.TYPE_USE)
     - 타입 변수를 포함해서 타입 선언부에서 애노테이션을 사용할 수 있다.
    @Repeatable(컨테이너 성격의 애노테이션 설정)
     - 여러 개의 애노테이션을 가지고 있을 컨테이너 애노테이션을 설정해주면 반복해서 애노테이션 사용이 가능하다.
     - 컨테이너의 애노테이션 설정(Retention, Target)은 반드시 자기자신이 감싸는 애노테이션의 범위보다 같거나 넓어야 한다.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(ChickenContainer.class)
public @interface Chicken {
    String value() default "후라이드";
}

 

  • 중복 애노테이션 컨테이너 만들기
    • @ChickenContainer
      • 컨테이너 애노테이션은 중복 애노테이션과 @Retention 및 @Target이 같거나 더 넓어야 한다.
    • ChickenContainer.java (중복 애노테이션의 컨테이너 애노테이션)
/*
    컨테이너 애노테이션은 자기자신이 감쌀 애노테이션 배열을 가지고 있어야 한다.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
    Chicken[] value();
}

 

  • 중복 애노테이션 참조하기
    • Main.java
@Chicken
@Chicken("양념")
public class Main {
    public static void main(@Chicken String[] args) throws @Chicken RuntimeException, NoSuchMethodException, NoSuchFieldException {
        List<@Chicken String> names = Arrays.asList("dev");

        /* 애노테이션 읽기 */
        //1. 클래스에서 해당 애노테이션 타입으로 바로 읽어오는 방법
        Chicken[] chickens = Main.class.getDeclaredAnnotationsByType(Chicken.class);
        Arrays.stream(chickens).forEach(c -> System.out.println(c.value()));
        System.out.println("###############");
        //2. 컨테이너 애노테이션 타입으로 읽는 방법
        ChickenContainer chickenContainer = Main.class.getAnnotation(ChickenContainer.class);
        Arrays.stream(chickenContainer.value()).forEach(c -> System.out.println(c.value()));
    }
}

반응형

+ Recent posts