애너테이션(Annotation)
애너테이션은 코드 메타 데이터이다. 메타데이터는 자신의 정보를 담고있는 데이터를 말한다.
패키지, 클래스, 메소드, 변수, 파라미터등에서 사용될 수 있으며, 자바 8부터는 코드의 거의 모든 부분에서 사용될 수 있다.
애너테이션이 적용된 코드는 직접적으로 애너테이션으로부터 영향을 받지 않는다. 단지 다른 프로그램(서브시스템)에 애터네이션에 대한 정보를 제공한다.
애너테이션 작성 방법
Transactional.class
@Retention( RetentionPolicy.RUNTIME)
@Inherited
@Target(ElementType.METHOD)
public @interface Transactional {
String value();
}
- @Target : 애너테이션이 적용가능한 대상을 지정하는데 사용한다.
- TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
- @Inherited : 애너테이션이 자손 클래스에 상속되도록 한다.
- @Retension : 애너테이션이 유지되는 범위를 지정하는데 사용한다.
- RetentionPolicy.SOURCE
- 소스파일만 존재한다. 클래스파일에는 존재하지 않는다.
- RetentionPolicy.CLASS
- 클래스 파일에 존재한다. 실행시에는 사용할 수 없다. 기본값이 적용된다.
- RetentionPolicy.RUNTIME
- 클래스 파일에 존재한다. 실행시에 사용할 수 있다.
- RetentionPolicy.SOURCE
애너테이션 정보를 읽는 방법
애너테이션의 정보를 읽기위해 자바 리플렉션을 이용한다.
Cell.java
public class Cell {
@Transactional("cell")
public void setValue(){
System.out.println("Hello World!");
}
}
CellTest.java
class CellTest {
@DisplayName("read annotation")
@Test
void getAnnotation(){
Cell cell = new Cell();
Arrays.stream(cell.getClass().getMethods())
.filter(m -> m.isAnnotationPresent(Transactional.class))
.map(m -> m.getAnnotation(Transactional.class))
.forEach(System.out::println);
}
}
getClass().getMethods()
- Cell의 클래스 정보로 Cell에 작성한 Method에 대한 정보를 가져온다.
method.isAnnotationPresent(Transactional.class)
- Method 중에서 @Transactional 애너테이션이 붙은 메서드를 찾으면 True를 반환한다.
m.getAnnotation(Transactional.class)
- @Transactional 애너테이션에 대한 정보를 가져온다.
찾은 Transactional 애너테이션 정보
@annotation.Transactional(value=cell)
'Java' 카테고리의 다른 글
ClassLoader (0) | 2021.11.30 |
---|---|
Class 객체 (0) | 2021.11.30 |
OpenJDK 버전 변경하며 사용하는 방법 (0) | 2021.10.20 |
try-with-resources 를 사용하자 (0) | 2021.06.28 |
Reflection 을 이용해 Interface 정보 얻기 (0) | 2021.05.03 |