리플렉션(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 와 동일하게 리플렉션으로 부여한 어노테이션 값을 취득할 수 있다.