본문 바로가기

프로그래밍/JAVA

Annotation

1. Annotation 정의

음 annotation도 일종의 클래스이다. 단지 메타 정보가 추가된다는 차이정도?

이클립스 File>New>Annotation 을 선택한다.

원하는 Annotation 명을 넣고 생성.


아주 심플하게 Annotation 이 생성되었다.

public @interface MyAnnotation {

}


위처럼 정의하고 필요한 곳에서 

@MyAnnotation

public void sampleFunction( ) {

}


이렇게 사용하면 된다.



2. 조금더 세부적인 설정과 멤버변수 추가(META-ANNOTATION)


@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

public int value();

public String name() default "";

}



@Target : Annotation의 형식을 지정한다. 

TYPE은 클래스나 인터페이스, enum 등에 지정. 

(TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER, LOCAL_VARIABLE, ANNOTATIION_TYPE, PACKAGE)


@Retention : Annotation의 지속성

(CLASS, RUNTIME, SOURCE)


@Inherited : Annotation도 상속



3. Annotation의 사용

@MyAnnotation( value=0, name="Test Object")

public class TestDataClass {


}


4. Annotation 정보 얻기

TestDataClass data = new TestDataClass();

Annotation anno = data.getClass().getAnnotation(MyAnnotation.class);

if( anno instanceof MyAnnotation ) {

MyAnnotation myAnno = (MyAnnotation) anno;

myAnno.value();

myAnno.name();

}


5. 메쏘드 Annotation을 검색

Annotation Target 수정

@Target(Element.METHOD)

.

.


public class TestDataClass {

@MyAnnotation( value=10, name="function 1")

public void sampleFunction() {

.

.

}


}


// 일단 해당 클래스의 메쏘드들을 모두 읽어온다.

Method[] methodArray = data.getClass().getMethods();


// 루프를 돌며 메쏘드 Annotation을 검사한다.

for( Method method : methodArray ) {

// 메쏘드에 annotation 이 있는지 확인

if( method.isAnnotationPresent( MyAnnotation.class ) ) {

Annotation[] anns = method.getDeclaredAnnotations();

// Annotation[] anns = method.getAnnotations();

// Annotations ann = method.getAnnotation( MyAnnotation.class );


for( Annotation ann : anns ) {

if( ann instanceof MyAnnotation ) {

MyAnnotation myAnno = (MyAnnotation) anno;

myAnno.value();

myAnno.name();


// 해당 메쏘드를 실행하는 등의 처리~

method.invoke( data );

}

}


}

}


요렇게 다양한 object들에 대해 Annotation과 그 멤버 변수값에 따라 임의의 처리가 가능하게 된다. 일반적으로 클래스 혹은 인터페이스를 상속해 그룹을 지어 사용하게 되는데, Annotation을 사용하면 서로다른 클래스나 이름이 다른 메쏘드를 Annotation에 따라 호출이 가능해진다.


'프로그래밍 > JAVA' 카테고리의 다른 글

힙 덤프 명령  (0) 2017.02.23
jni 관련~  (2) 2014.04.16
AES 암호화  (0) 2014.03.27
[OSGi] 서비스 등록 및 해제  (0) 2014.03.21
[eclipse] eclipse 4 platform  (0) 2014.03.17
[swt] 이벤트  (0) 2014.03.14
[eclipse] Extention Points  (0) 2014.03.14
[eclipse] simple plug-in example  (0) 2014.03.13
Apache HttpClient 관련 정리  (0) 2014.03.11
[JAVA TV] MHP 배경이미지 처리  (0) 2013.12.27