본문 바로가기
JAVA

[Java] Annotation

by 햄과함께 2021. 2. 5.
320x100

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 어노테이션이 있는 EncryptTargetDocumented 어노테이션이 없는 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/

320x100

'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

댓글