Annotation

Ahri·2022년 1월 3일
1

Annotation이란?

  • 비즈니스 로직에 영향을 주지 않으면서 소스코드에 메타데이터(데이터에 대한 데이터)를 표현하는 방법
  • 특정 소스를 어떤 용도로 쓸지, 어떤 역할을 줄지 결정할 수 있음
  • AOP 관점

Annotation 만들기

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ahreumAnnotation {
	//Element
    String value() default "Ahreum Annotation Test";
}

@Retention(RetentionPolicy.~) : 어느 시점까지 보유할지 결정

  • @Retention(RetentionPolicy.RUNTIME): 런타임시 어노테이션 정보를 가져옴. 리플렉션 이용
  • @Retention(RetentionPolicy.SOURCE) : 소스상에서만 유지. Compile 이후 삭제
  • @Retention(RetentionPolicy.CLASS) : 리플렉션 이용해 어노테이션 정보를 얻을 수 없음. 바이트 코드 파일까지 정보 유지

@Target({ElementType.~}) : 적용대상

  • ElementType.PACKAGE : 패키지 선언시
  • ElementType.TYPE : 타입 선언시
  • ElementType.CONSTRUCTOR : 생성자 선언시
  • ElementType.FIELD : 멤버 변수 선언시
  • ElementType.METHOD : 메소드 선언시
  • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
  • ElementType.LOCAL_VARIABLE : 지역 변수 선언시
  • ElementType.PARAMETER : 매개 변수 선언시
  • ElementType.TYPE_PARAMETER : 타입 변수에만 사용
  • ElementType.TYPE_USE : 모든 타입 선언부에 사용

@Inherited : 자식 클래스가 어노테이션 상속 가능

@Repeatable : 반복적으로 어노테이션 선언 가능

사용 예제

public class AhreumDto {

    @ahreumAnnotation
    private String title; //디폴트값 들어감

    @ahreumAnnotation(value = "title2 번째")
    private String title2;

    public String getTitle(){
        return title;
    }
    public String getTitle2(){
        return title2;
    }
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Field[] fields = AhreumDto.class.getDeclaredFields();
        AhreumDto instance = AhreumDto.class.newInstance();
        for(Field f : fields){
            System.out.println(f.getName()); //title, title2 (field 출력됨)
            f.setAccessible(true);
            f.set(instance,f.getAnnotation(ahreumAnnotation.class).value());
        }
        System.out.println(instance.getTitle()); // Ahreum Annotation Test
        System.out.println(instance.getTitle2()); // title2 번째
    }

0개의 댓글