[@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) {
}
}
}
'IT 개발 > JAVA' 카테고리의 다른 글
파일 업로드 - FileUtils.copyInputStreamToFile() (0) | 2021.10.18 |
---|---|
브라우저 확인 후 파일 다운로드 (0) | 2021.09.23 |
Spring Boot Swing Application / GUI (WindowBuilder Editor 사용) (0) | 2020.11.10 |
XML 파싱 - JAXB marshal, unmarshal (마샬, 언마샬) (0) | 2020.10.06 |
@Controller 와 @RestController 차이점 (0) | 2020.10.05 |