자바 어노테이션의 모든것 - (2)
2. 자바 어노테이션 이야기
2-1. 왜 어노테이션인가?
자바 스펙에서 어노테이션은 다음에서 나타내 지고 있다 :
- JSR 175 A metadata facility for the Java programming Language
- JSR 250 Common Annotations for the Java Platform
2-2. 소개
2-3. Consumers (소비자)
어노테이션의 목적이 정확히 먼지, 어떻게 사용되는지 이해하는건 쉽지 않다, 그것들은 어떠한 기능적 로직을 가지고 있지 않으며 , 코드에 영향을 미치지 않는다. 어노테이션이 뭘 할까?
이것을 위한 설명으로 난 어노테이션 컨슈머스라고 말하는게 있는데 , 이것들은 시스템이나 서드파티 어플리케이션 (스프링같은) 으로서 어노테이션이 적용된 코드를 어노테이션 정보로부터 의존적인 여러가지 행동을 취한다.
예를들어 자바 빌트인 어노테이션경우에는 소비자는 자바가상머신(JVM) 이며 어노테이션이 적용된 코드를 실행한다. 사용자 정의 어노테이션의 경우의 예로는 JUnit, Spring 등이 있다.
그리고 소비자는 코드에서부터 어노테이션을 분석하기위해 자바 리플렉션을 이용한다.
2-4. 유즈 케이스
어노테이션은 다양한 목적으로 사용되는데 대표적으로는
- 컴파일러를 위한 정보제공 : Java 8 , @supresswarnings
- 자동 문서 작성 : generate reports automatically like Jenkins, Jira or Teamcity.
- 코드 자동 생성 : A good example of this is the JAXB library.
- 런타임 프로세싱 : testing (Junit), dependency injection (Spring), logging (Log4J) ,data access (Hibernate) etc.
2-5. Java 8 에서 어노테이션
Java 8 은 여러가지 훌륭한 기능을 가지고 왔는데 어노테이션 프레임워크도 발전되었다.
다음 예예를 통해 확인해 보도록 하자.
:
Afterwards, we create the annotation itself and we mark it with the Meta annotation @Repeatable:
Finally we can see how to use it (repeatedly) in a given class:
If we would try to do the same with a non repeatable annotation:
We would get an error from the compiler like:
- Since Java 8 is also possible to use annotations within types. That is anywhere you can use a type, including the new operator, castings, implements and throws clauses. Type Annotations allow improved analysis of Java code and can ensure even stronger type checking. The following examples clarify this point:
All this was not possible until Java 8.
- : this annotation indicates that the element annotated is going to be a functional interface. A functional interface is an interface that has just one abstract method (not a default one). The compiler will handle the annotated element as a functional interface and will produce an error if the element does not comply with the needed requirements. Here is an example of functional interface annotation:
This annotation can be applied to classes, interfaces, enums and annotations and it is retained by the JVM and available in Run time. Here is its declaration:
2-6. Retrieving 어노테이션
자바 리플렉션 API 는 여러가지 메소드를 포함한다. 그 메소드들은 런타임에 클래스,메소드등으로부터
어노테이션 정보를 얻을수있게 한다. 그것을 통해서 스프링같은 서드파티 프레임워크는 클래스들을
조작할수있게 된다.
저런 모든 메소드들을 포함한 인터페이스는 AnnotatedElement 이며 대표적으로 다음과 같다.
- : 주어진 엘리먼트가 가지고있는 모든 어노테이션을 배열로 가져온다.
- : 엘리먼트가 어노테이션을 가지고있는지 체크한다.
- : 파라미터로 넘겨진 엘리먼트에 대한 단일 어노테이션을 가져온다.
This class is implementing by , and among others, so can be used basically with any kind of Java element.
Now we are going to see an example of how to read the annotations present in a class or method using the methods listed above:
We write a program that tries to read all the annotations present in a class and its methods (we use for this example the classes defined before):
The output of this program would be:
In the program above we can see the usage of the method in order to retrieve all annotations for a given object (a method or a class). We also showed how to check if an specific annotation is present and to retrieve it in positive case using the methods and .
Reference
http://tutorials.jenkov.com/java-reflection/annotations.html
http://tutorials.jenkov.com/java/annotations.html
http://www.javacodegeeks.com/2014/11/java-annotations-tutorial.html
http://hmkcode.com/spring-configuration-xml-annotation-java/