반응형
애노테이션 관련 두 가지 큰 변화
- 자바 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()));
}
}
반응형
'Java > 기본' 카테고리의 다른 글
자바8 메모리 관리(Java 8 Memory Management) 변화 - PermGen, Metaspace (0) | 2021.07.05 |
---|---|
자바 배열 정렬(Java Array Sort) - 정렬(Arrays.sort), 병렬 정렬(Arrays.parallelSort) 비교 (0) | 2021.07.05 |
자바 동시성(Java Concurrent) - 4 (CompletableFuture) (0) | 2021.07.05 |
자바 동시성(Java Concurrent) - 3 (Callable, Future) (0) | 2021.07.04 |
자바 동시성(Java Concurrent) - 2 (Executors) (0) | 2021.07.04 |
[참고자료]
더 자바, Java 8, 백기선