[java] 리플렉션(Reflection) 2 : 어노테이션 이용

반응형

리플렉션(Reflection) : 어노테이션 이용

 

어노테이션 취득

리플렉션으로 어노테이션의 값을 취득할 수 있다.

 

예제코드

테스트를 위해 어노테이션 작성 : @MyAnnotation

package hello.proxy.reflection;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 어노테이션 보유 : RUNTIME 은 실행시에도 어노테이션 정보를 읽어올 수 있음
@Retention(RetentionPolicy.RUNTIME) // 디폴트 : CLASS
// 허용하는 타입 지정 : 클래스, 인터페이스를 지정
@Target(ElementType.TYPE)
public @interface MyAnnotation {

    String name() default "default";

    int value();
}

 

어노테이션 작성 (1) @Retation

@Retation 은 @MyAnnotation 의 정보가 클래스파일이나 실행시에 보존할지 지정한다.

RetentionPolicy 설명
RUNTIME 어노테이션이 클래스파일에 남겨지고 실행시(런타임)에도 JVM 에 보존된다.
CLASS 어노테이션이 클래스파일에 기록되지만, 실행시(런타임)에는 JVM 에 보존되지 않는다.
SOURCE 어노테이션이 클래스파일에 기록되지 않는다. 

@Retation 을 생략한 경우, CLASS 와 같다. 즉 디폴트 값이 RetationPolicy.CLASS 이다.

 

어노테이션 작성 (2) @Target

@Target 은 @MyAnnotation 이 메소드, 필드 등 어느 곳까지 지정할 수 있는지 ElementType 으로 범위를 부여한다.

주요 ElementType 설명
CONSTRUCTOR 생성자
FIELD 필드
METHOD 메소드
TYPE 클래스, 인터페이스 등 선언

@Target 을 생략한 경우, 파라미터 이외의 전체 부분에 지정할 수 있다.

 

어노테이션 작성 (3) @Inherited

@Inherited 는 어노테이션을 하위 클래스까지 전달할지 여부를 지정한다. (상속여부)

 

 

예제코드 : Guild

Guild 클래스를 생성하여, 작성한 @MyAnnotation 을 붙여준다.

package hello.proxy.reflection;

// value 만 정의하는 경우 생략해도 된다.
//@MyAnnotation(33)
@MyAnnotation(name = "sample name",value = 50)
public class Guild {

}

name 을 "sample name" 으로, value 를 50 으로 지정한 Guild 클래스를 생성했다.

리플렉션을 이용하면 이 클래스에 붙여진 어노테이션을 취득할 수 있다.

getAnnotion() 메소드를 이용하며, 인수로 취득하고자 하는 어노테이션 형을 지정한다.

 

코드로 확인하자

public class ReflectionTest {

    @Test
    void annotation() {
        try {
            // Guild.Class 와 동일
            Class<?> guildClass = Class.forName("hello.proxy.reflection.Guild");
            // 클래스에 붙어있는 어노테이션 취득
            MyAnnotation guildClassAnnotation = guildClass.getAnnotation(MyAnnotation.class);
            // 어노테이션 값 취득
            String name = guildClassAnnotation.name();
            int value = guildClassAnnotation.value();
            // 출력
            System.out.println("name = " + name + " , value = " + value);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

}

출력결과

name = sample name , value = 50

Guild.class.getAnnotation(MyAnnotation.class) 으로 리플렉션으로 클래스에 부여한 어노테이션 값을 취득할 수 있다.

 

필드나 메소드에 부여한 어노테이션을 취득하고자 하는 경우, Field 클래스, Method 클래스getAnnotation() 메소드를 이용하면 Class 와 동일하게 리플렉션으로 부여한 어노테이션 값을 취득할 수 있다. 

 

반응형