Annotation의 변화

구름코딩·2020년 10월 10일
0

java8 _ 더 자바

목록 보기
21/23
post-custom-banner

자바 8부터

  • 애노테이션을 타입 선언부에서도 사용할 수 있게되었다
  • 애노테이션을 중복해서 사용할 수 있게 되었다

추가된 @Target(ElementType)

  • TYPE_PARAMETER
  • TYPE_USE

TYPE_PARAMETER

  • 타입 변수에만 사용할 수 있다

예시

public static void main(String[] args) {
}
static class test<@Chicken T>
{
    //함수의 매개변수 부분에는 애노테이션을 붙일수가 없다
    public static <@Chicken C> void print(C c) {
        System.out.println(c);
    }
}

TYPE_USE

  • 타입 변수를 포함해서 모든 타입 선언부에 사용할 수 있다
  • 타입 선언 부 : 제네릭 타입, 변수 타입, 매개변수 타입, 예외 타입 등이 선언되는 곳
    예시
@Chicken
public class enotation {
    public static void main(@Chicken String[] args) throws @Chicken RuntimeException{
        List<@Chicken String> list = Arrays.asList("woonsik");
    }
    static class test<@Chicken T>
    {
        public static <@Chicken C> void print(@Chicken C c) {
            System.out.println(c);
        }
    }
}

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

중복 사용할 애노테이션 만들기 Repeatable(컨테이너 애노테이션 type)

  • @Repeatable()을 중복사용할 애노테이션에 달아준다
  • 괄호 안에 중복사용할 애노테이션을 담고있는 컨테이너 애노테이션의 타입을 넣는다
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(ChickenContainer.class)
//여러 애노테이션을 감싸고 있을 컨테이너 애노테이션 타입을 매개변수로 선언

public @interface Chicken {
    String value(); //치킨의 정보를 담는 변수
}

중복 사용할 애노테이션을 담는 컨테이너 만들기

  • 컨테이너 애노테이션은 자신이 감싸는 애노테이션의 @Retention 전략과 사용할수 있는 범위인 @Target이 더 넒거나 같아야한다
  • 컨테이너 애노테이션 내부 코드에는 감싸는 애노테이션을 담을 해당 애노테이션 타입의 배열이 필요하다
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
    //자신이 가지고있을 애노테이션의 배열을 갖고 있어야한다
    Chicken[] value();
}

사용

@Chicken("앙념")
@Chicken("후추")
@Chicken("후라이드")
@Chicken("마늘")
@Chicken("마라")
public class ChickenMain {
    public static void main(String[] args) {

//애노테이션 타입으로 가져오는 방법
Chicken[] chickens = enotation.class.getAnnotationsByType(Chicken.class);
Arrays.stream(chickens).forEach(s-> {
    System.out.println(s.value());
});

//애노테이션 컨테이너 타입으로 가져오는 방법
ChickenContainer chickenContainer = enotation.class.getAnnotation(ChickenContainer.class);
Arrays.stream(chickenContainer.value()).forEach(s -> {
    System.out.println(s.value());
});

}}
//출력
앙념
후추
후라이드
마늘
마라
---
앙념
후추
후라이드
마늘
마라
profile
내꿈은 숲속의잠자는공주
post-custom-banner

0개의 댓글