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();

        forField field : fields ){

            ExampleAnno annotation = field.getAnnotation(ExampleAnno.class);

            if( annotation != null){

                field.setAccessible(true); //private 접근

                field.set(target, annotation.value());

            }

        }

 

§  =>  어노테이션이 필드에 선언되었을 때 필드에 값을 지정해주거나 혹은 관련 작업을 할 수 있습니다.

 

댓글

가장 많이 본 글