2014년 10월 27일 월요일

[java] annotation

자바에서 Annotation은 소스코드에 주석을 다는 일이다.
별도의 properties파일이나 xml같은 설정파일에 작성하는 부가적인 정보를 어노테이션으로 간편하게 설정할 수 있으므로, 코드의 양을 줄일 수 있다. 

어노테이션은 @를 붙여 사용하며, 우리가 흔히 볼 수 있었던 어노테이션에는 @Override, @Deprecated 등이 있다.

어노테이션은 아래와 같이 사용자가 정의해서 쓸 수 있다.

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Anno { 
    public String defaultVal() default "OK"
    public String val(); 
}

여기서 Target은 어노테이션을 적용할 대상을 선택하고, Retention은 이 어노테이션의 정보가 어디까지 유지되는지 지정한다.

@Target - Constructor, Field, Enum, Local Variable, Method, Package, Parameter, Type(Class)
@Retention - Source, Class, Runtime
@Documented - 어노테이션을 javadoc에 포함한다.
@Inherited - 어노테이션 상속을 가능케 한다.

다음은 위에 정의한 어노테이션을 어떻게 사용하는지 보겠다.

@Anno(val = "Annotation!!"
public class Member { 
.....
}

Target을 TYPE인 클래스에 했으므로 위와 같이 클래스 위에 어노테이션을 사용하고, 아래와 같은 방식으로 어노테이션의 정보를 알아 올 수 있다.

Member member = new Member(); 
System.out.println(member.getClass().getAnnotation(Anno.class).val()); 
System.out.println(member.getClass().getAnnotation(Anno.class).defaultVal());

결과는
Annotation!!
OK


출처 : http://blog.naver.com/cracker542/40159657935

What are Java Annotations

Java5 에 소개된 기능으로, meta data 를 코드형태로 담을 수 있고, runtime 에 이 meta data 에 접근할 수 있다. pre-compiler 가 코드를 conversion 할 때 사용되기도 한다.

Annotation 은 interface 형태이다.

@Retention( RetentionPolicy.RUNTIME );
@Target( ElementType.TYPE )
public @interface TestAnnotation{
public String name();
public String value();
}

@TestAnnotation(name="variable", value="value")
public class TestClass{
// ...
}

@Retention( RetentionPolicy.RUNTIME ) 은 runtime 에 reflection 형태로 사용될 수 있다는 것을 의미한다.
이 구문이 없으면 runtime 에 이 annotation 은 사라진다. ( 구체적으로 compile time 에 제거한다. )

@Target( ElementType.TYPE ) 은 class, interface 와 같은 type 에 쓰인다는 것이다. TYPE 대신 METHOD, FIELD 를 줄수도 있다. 만약 이를 명시해주지 않으면 모든 곳에 사용될 수 있다.



Class Annotations

Annotations[] annotations = aClass.getAnnotations();

if ( annotaion instanceof TestAnnotation ){
((TestAnnotation )annotaion).name();
((TestAnnotation )annotaion).value();
}



Method Annotations

method.getDeclaredAnnotations();





Parameter Annotations

method.getParameterAnnotations();



Field Annotations

field.getDeclaredAnnotations();
field.getAnnotation( TestAnnotation.class );


댓글 없음:

댓글 쓰기