Java ) Custom Annotation 간단 정리 !
·
Java Spring을 이용하여 코딩을 하다가 사용자정의의 Annotation에 대한 내용을 알게되어 정리해봅니다.
·
Annotation을 직접 생성하여 해당 어노테이션에 원하는 작업을 정의
할 수 있습니다.
·
이는 반복적인 코드를 줄여주고 좀 더 효율적으로 코드작성을
할 수 있도록 도와줍니다.
· Annotation ?
o
자바 소스코드에 추가하여 사용할 수 있는 메타데이터.
o
메타데이터는 컴파일과정과 실행과정에서 코드를 어떻게
컴파일하고 처리할 것인지 알려주는 정보입니다.
o
앞에 @기호를
붙여서 사용합니다.
o
클래스파일에 임베디드되어 컴파일에의해 생성된 후 JVM에 포함되어 작동합니다.
·
사용
o
@interface를 사용하여 생성합니다.
o
어노테이션은 멤버를 가지며, 타입과 이름, 디폴트 값을 설정할 수 있습니다.
o
만약 그저 마킹만 하기위한 annotaion이라면(마킹된 클래스나 메서드만의 작업을 정의하기
위해서라면) 멤버를 명시하지 않아도 됩니다.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ExampleAnno{
int value() default 10;
String value2();
}
o
Default 값을 생략할 수 있습니다. 생략할 경우 어노테이션 호출시 매개변수 값을 넣어주어야합니다.
o
@Target
§ 선언한 어노테이션이 적용될 수 있는 위치를 결정
§ TYPE : class, interface, enum에 적용된다.
§ FIELD : 클래스 필드 변수
§ METHOD : 메서드
§ PARAMETER : 메서드 인자
§ CONSTRUCTOR : 생성자
§ LOCAL_VARIABLE : 로컬 변수
§ ANNOTATION_TYPE : 어노테이션 타입에만
적용된다
§ PACKAGE : 패키지
§ TYPE_PARAMETER : 자바8부터 추가된 값으로 제네릭 타입 변수에 적용된다. (ex.
MyClass<T>)
§ TYPE_USE : 자바8부터 추가된 값으로 어떤 타입에도 적용된다 (ex. extends,
implements, 객체 생성시등등)
o @Retention
§ 어노테이션이 어느레벨까지 유지되는지를 결정짓는다
§ SOURCE : 자바 컴파일에 의해서 어노테이션은
삭제된다
§ CLASS : 어노테이션은 .class 파일에 남아 있지만, runtime에는 제공되지 않는
어노테이션으로 Retention policy의 기본 값이다
§ RUNTIME : runtime에도 어노테이션이 제공되어 자바 reflection으로 선언한
어노테이션에 접근할 수 있다
o @Inherited
§ 이 어노테이션을 선언하면 자식클래스가 어노테이셔을 상속받는다.
o @Documented
§ 새로 생성한 어노테이션이 자바 문서 생성시 자바 문서에도 포함시킨다.
o @Repeatable
§ 어노테이션 반복 선언
o 커스텀한 어노테이션을 사용할 때는 자바 reflection을
이용하면됩니다.
§ Ex)
Method method = TheClass.class.getMethod("exMethod");
Annotation[] annotations = method.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof ExampleAnno) {
ExampleAnno exampleAnno = (ExampleAnno) annotation;
System.out.println("value: " + exampleAnno.value());
System.out.println("value2: " + exampleAnno.value2());
}
}
§ => exMethod라는 이름을 가진 메소드의 어노테이션들을
가져와서 어노테이션이 가지고있는 멤버들에 접근할 수 있습니다.
§ Ex)
Field[] fields = target.getClass().getDeclaredFields();
for( Field field : fields ){
ExampleAnno annotation = field.getAnnotation(ExampleAnno.class);
if( annotation != null){
field.setAccessible(true); //private에 접근
field.set(target, annotation.value());
}
}
§ => 어노테이션이 필드에 선언되었을 때 필드에 값을 지정해주거나 혹은 관련 작업을 할 수 있습니다.
댓글
댓글 쓰기