Annotation 정의
java5에서 추가된 기능.
주석이라는 뜻이지만 메타데이터(데이터에 대한 추가 데이터) 역할을 한다.
클래스, 함수 등에 사용할 수 있다.
정의 방법
package encrypt;
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptTarget {
String name();
}
@interface을 클래스 앞에 붙여서 정의해준다.
어노테이션 종류
package | name | since (java version) | description |
java.lang (표준) |
Override | 1.5 | 부모 클래스의 메서드 오버라이드 |
Deprecated | 1.5 | 더 이상 개선이 진행되지 않음을 의미한다. | |
SuppressWarnings | 1.5 | 컴파일 경고를 출력하지 않고 싶을 때 사용 | |
SafeVarargs | 1.7 | 가변 인자를 사용했을 때 발생하는 잠재적인 안전하지 않은 작업에 대한 경고를 출력하지 않는다. | |
java.lang.annotation (메타) |
Retention | 1.5 | 어노테이션을 언제까지 메모리에 유지하는지 명시한다. |
Documented | 1.5 | javadoc에 문서를 추가함 | |
Target | 1.5 | 어노테이션의 적용 대상을 명시 | |
Inherited | 1.5 | 상속한 서브클래스도 해당 어노테이션을 가진다.. | |
Repeatable | 1.8 | 어노테이션을 반복 정의 가능. | |
Native | 1.8 | 정의된 상수가 네이티브 코드에서 사용될 수 있음을 명시 |
@Retention
어노테이션을 언제까지 유효한 값으로 보고 가지고 있을 것인지를 정한다.
지정한 메모리까지만 저장된다.
// java.lang.annotation.Retention
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
Retention 어노테이션은 RetentionPolicy 이넘타입인 value를 가진다.
RetentionPolicy 타입으로 언제까지 어노테이션 정보를 가져갈지 정한다.
RetentionPolicy | description |
SOURCE | 소스상에서만 유효하다. 컴파일러가 제거한다. ex) 컴파일러가 필요한 정보 @Override, @SuppressWarnings, @Native |
CLASS | DEFAULT. 클래스파일에 기록된다. 그러나 런타임 시에 필요한 정보는 아니다. |
RUNTIME | 클래스파일에 기록되며 런타임 시 VM에서도 유지된다. @Documented, @Deprecated |
@Target
어노테이션이 적용되는 대상을 지정한다.
// java.lang.annotation.Target
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
ElementType | description |
PACKAGE | 패키지 |
TYPE | 타입 |
CONSTRUCTOR | 생성자 |
FIELD | 멤버 변수 |
METHOD | 함수 |
ANNOTATION_TYPE | 어노테이션 타입 |
LOCAL_VARIABLE | 지역변수 |
PARAMETER | 매개변수 |
TYPE_PARAMETER | 매개변수 타입 |
TYPE_USE | 타입 사용 시 |
@Documented
// java.lang.annotation.Documented
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
javadoc으로 문서 생성 시 어노테이션에 대한 문서도 생성하고자 할 때 사용한다.
예시
소스코드
// encrypt.NotDocumented
package encrypt;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotDocumented {
// ...
}
// encrypt.EncryptTarget
package encrypt;
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptTarget {
// ...
}
// encrypt.Member
package encrypt;
public class Member {
@EncryptTarget(name = "Member")
@NotDocumented(name = "Member")
public void print() {
System.out.println("Member");
}
}
Documented 어노테이션이 있는 EncryptTarget과 Documented 어노테이션이 없는 NotDocumented 어노테이션이 있다.
javadoc 생성하기
Tool > Generate JavaDoc
Output directory 선택.
Open generated documentation in brower 선택.
OK.
Member.print 함수의 문서에는 @EncryptTarget 에 대한 정보만 명시되어있다.
Annotation Processor
특정 annotation이 명시된 클래스, 메서드 등에 추가 기능을 구현할 수 있다.
Lombok에서 @Data, @Getter, @Setter 와 같은 어노테이션의 처리등에 사용 중이다.
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("*")
public class EncryptProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
return false;
}
}
AbstractProcessor 추상 클래스를 상속받아 구현한다.
process 추상 메서드는 반드시 구현되어야 하며 주된 로직을 해당 함수에서 구현한다.
@SupportedSourceVersion 는 해당 프로세스가 적용되는 자바 버전을 명시한다.
@SupportedAnnotationTypes 는 프로세스가 처리하는 어노테이션을 명시한다.
jar 생성 (Intellij)
File > Project Structure
Artifacts > + (Add) > JAR - From modules with dependencies
Main Class 선택 > OK > output directory 지정 > OK
Build > Build Artifacts > 플젝이름:jar > Build
참고
pluu.github.io/blog/android/2015/12/24/annotation-processing-api/
'JAVA' 카테고리의 다른 글
[java] Enum (0) | 2021.01.30 |
---|---|
[Java] 멀티쓰레드 (0) | 2021.01.23 |
[Java] 패키지 (0) | 2020.12.27 |
[Java] 데이터, 변수, 배열 (0) | 2020.12.27 |
[Java] JVM (0) | 2020.12.27 |
댓글