기록/JAVA

[JAVA8] 어노테이션의 변화

jeongdalma 2021. 1. 17. 14:45

두가지 큰 변화

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

타입 선언 부

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

타입에 사용할 수 있으려면 

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

@Chicken

@Retention(RetentionPolicy.RUNTIME)
// 이 애노테이션 정보를 언제까지 유지할 것인가
@Target(ElementType.TYPE_PARAMETER)
// 이 애노테이션을 사용할 곳
public @interface Chicken {
}
    public static void main(String[] args) {

    }
    static class FeelsLikeChicken<@Chicken T> {
        // <C> 는 타입 파라미터
        // print 메소드의 C는 타입
        public static <@Chicken C> void print(C c){

        }
    }

 

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

@Chicken

@Retention(RetentionPolicy.RUNTIME)
// 이 애노테이션 정보를 언제까지 유지할 것인가
@Target(ElementType.TYPE_USE)
// 이 애노테이션을 사용할 곳
public @interface Chicken {
}
    public static void main(@Chicken String[] args) throws @Chicken RuntimeException {
        List<@Chicken String> names = Arrays.asList("hyunjun");
    }
    static class FeelsLikeChicken<@Chicken T> {
        // <C> 는 타입 파라미터
        // print 메소드의 C는 타입
        public static <@Chicken C> void print(@Chicken C c){

        }
    }

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

  • 중복 사용할 어노테이션 만들기
  • 중복 어노테이션 컨테이너 만들기
    • 컨테이너 어노테이션은 중복 어노테이션과 @Retention 및 @Target이 같거나 더 넓어야 한다.

@Chicken

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(ChickenContainer.class)
public @interface Chicken {
    String value();
}

ChickenContainer

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
    Chicken[] value();
}
@Chicken("양념")
@Chicken("마늘")
@Chicken("간장")
@Chicken("후라이드")
public class AppForJava8Annotation {

    public static void main(String[] args) {
        Chicken[] chickens = App.class.getAnnotationsByType(Chicken.class);

        Arrays.stream(chickens).forEach( c ->{
            System.out.println(c.value());
        });

        ChickenContainer chickenContainer = App.class.getAnnotation(ChickenContainer.class);
        Arrays.stream(chickenContainer.value()).forEach(c -> {
            System.out.println(c.value());
        });
    }
}

 

  • 스프링 어노테이션 및 메소드 
 

[spring] 스프링 어노테이션 및 메소드 정리

Java Annotation Detail @interface - 어노테이션 클래스에 선언 - 이 파일을 어노테이션 클래스로 선언 - 해당 클래스명을 가진 어노테이션이 생성되었다고 보면 됨! 1 2 3 4 @Target(ElementType.PARAMETER) @Re..

kkambi.tistory.com

 

 

 

더 자바, Java 8 - 인프런

자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이

www.inflearn.com