본문 바로가기
IT 개발/JAVA

@annotation 생성

by Love of fate 2021. 5. 6.
728x90
반응형

[@annotation 생성]

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
    String name();
    String value();
}

public class TheClass {
    @MyAnnotation(name = "someName", value = "Hello World")
    public String myField = null;
}

커스텀

고객(customer)이 요청한 대로 특별 주문 제작을 행했다는 뜻으로 쓰인 단어인데, 이렇게 제작된 물건은 당연히 그 물건의 원래 규격과는 다르며, 여기에서 착안하여 원래의 모습과 달라진 물건을 커스텀으로 칭하게 된다.

 

- 다른 어노테이션에 적용되는 어노테이션 - 메타 어노테이션(Meta Annotation)

  @Retention,  @Documented, @Target, @Inherited

 

위 메타 어노테이션은 커스텀 어노테이션을 작성할 때 사용하는 어노테이션입니다. 각각 어떤 역할을 하는지는 다음 섹션에서 알아보도록 하겠습니다. 

 

@Target - Target 어노테이션은 선언한 어노테이션이 적용될 수 있는 위치를 결정한다. 

  • ElementType Enum에 선언된 값
    • 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, 객체 생성시등등)
    • MODULE : 자바9부터 추가된 값으로 모듈에 적용된
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
	String name();
    String value();
}

@MyAnnotation(name="someName", value = "Hello World")
public class TheClass {
}

//Target을 여러개 쓸 경우 
@Documented
@Retention(RUNTIME)
@Target({ TYPE, METHOD })
public @interface DescriptionAnno {

	String description();
	
}

 

 

@Retention - 어노테이션이 어느 레벨까지 유지되는지를 결정짓는다. 

RetentionPolicy Enum에 선언된 값 

 SOURCE : 자바 컴파일에 의해서 어노테이션은 삭제된다. 

 CLASS : 어노테이션은 .class 파일에 남아 있지만, runtime에는 제공되지 않는 어노테이션으로  Retention policy의 기본값이다. 

 RUNTIME : runtime에도 어노테이션이 제공되어 자바 reflection으로 선언한 어노테이션에 접근할 수 있다.

 

@Inherited

  이 어노테이션을 선언하면 자식 클래슥다 어노테이션을 상속받는다. 

 

@Documented

   이 어노테이션을 선언하면 새로 생성한 어노테이션이 자바 문서 생성시 자바 문서에도 포함시키는 어노테이션이다. 

 

@Repeatable

   자바 8에 추가된 어노테이션으로 반복 선언을 할 수 있게 해준다. 

 

클래스 필드에 선언

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
    String name();
    String value();
}

public class TheClass {
    @MyAnnotation(name = "someName", value = "Hello World")
    public String myField = null;
}

//클래스 필드에 선언
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String name();
    String value() default "기본 값";
}

//메서드에 선언
public class TheClass {
    @MyAnnotation(name = "doThisMethod", value = "Hello World")
    public void doThis() {
    }

    @MyAnnotation(name = "doThatMethod")
    public void doThat() {
    }
}

 

자바 리플렉션으로 커스텀 어노테이션 사용해보기

프로그램 실행 시 커스텀 어노테이션을 사용한 곳과 지정한 값들을 얻어오려면 자바 리플렉션을 사용해야 합니다. 자바 리플렉션을 사용해서 선언한 어노테이션  값을 얻어오는 건 비슷하다.

 

public class MethodAnnotationExecutor {
	public static void main(String [] args) throws NoSuchMethodException{
    	Method method =  TheClass.class.getmethod(doThis"); //자바 리플렉션 getMe
    	Annotation [] annotations = methos.getDeclatdAnnotatioins();
        
        for(Annotation annotations : annotations) {
        	
        }
    }
}

advenoh.tistory.com/21

728x90
반응형