ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 애노테이션의 변화
    백기선(인프런 강의)/더 자바, 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
Designed by Tistory.