-
애노테이션의 변화백기선(인프런 강의)/더 자바, Java 8 2020. 7. 24. 12:47반응형
애노테이션의 변화
애노테이션 관련 두가지 큰 변화
- 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨.
- 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨.
타입 선언 부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- @Target(ElementType.TYPE_PARAMETER)
- 예외 타입
타입에 사용할 수 있으려면
- TYPE_PARAMETER: 타입 변수에만 사용할 수 있다.
- TYPE_USE: 타입 변수를 포함해서 모든 타입 선언부에 사용할 수 있다.
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE, /** * Type parameter declaration * * @since 1.8 */ TYPE_PARAMETER, /** * Use of a type * * @since 1.8 */ TYPE_USE }
@Retention(RetentionPolicy.RUNTIME) //@Target(ElementType.TYPE_PARAMETER) @Target(ElementType.TYPE_USE) public @interface Chicken { }
public class App { public static void main(@Chicken String[] args) throws @Chicken RuntimeException { List<@Chicken String> names = Arrays.asList("JinSeok"); } //@Target(ElementType.TYPE_PARAMETER) parameter만 사용할 때 static class FeelsLikeChicken<@Chicken T> { } //@Target(ElementType.TYPE_USE) 사용할 때 static class FeelsLikeChicken2<@Chicken T> { // 앞에 재하는 <C> 는 타입 파라미터 // 뒤에 있는 C 는 타입 public static <@Chicken C> void print(@Chicken C c) { System.out.println(c); } } }
중복 사용할 수 있는 애노테이션을 만들기
- 중복 사용할 애노테이션 만들기
- 중복 애노테이션 컨테이너 만들기
- 컨테이너 애노테이션은 중복 애노테이션과 @Retention 및 @Target이 같거나 더 넓어야 한다.
중복사용할 어노테이션
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) @Repeatable(ChickenContainer.class) public @interface Chicken { String value(); }
중복 애노테이션의 컨테이너 애노테이션
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) public @interface ChickenContainer { Chicken[] value(); }
컨테이너 애노테이션으로 중복 애노테이션 참조
@Chicken("양념") @Chicken("마늘간장") public class App { public static void main(String[] args) { ChickenContainer chickenContainer = App.class.getAnnotation(ChickenContainer.class); Arrays.stream(chickenContainer.value()).forEach(c -> { System.out.println(c.value()); }); } }
반응형'백기선(인프런 강의) > 더 자바, Java 8' 카테고리의 다른 글
Metaspace (0) 2020.08.09 배열 Parallel 정렬 (0) 2020.08.05 CompletableFuture 2 (0) 2020.07.23 CompletableFuture (0) 2020.07.22 Callable과 Future (0) 2020.07.20