Annotation이란?
- 비즈니스 로직에 영향을 주지 않으면서 소스코드에 메타데이터(데이터에 대한 데이터)를 표현하는 방법
- 특정 소스를 어떤 용도로 쓸지, 어떤 역할을 줄지 결정할 수 있음
- AOP 관점
Annotation 만들기
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ahreumAnnotation {
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());
f.setAccessible(true);
f.set(instance,f.getAnnotation(ahreumAnnotation.class).value());
}
System.out.println(instance.getTitle());
System.out.println(instance.getTitle2());
}