본문 바로가기

Java

애너테이션 (Annotation)

애너테이션(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
      • 클래스 파일에 존재한다. 실행시에 사용할 수 있다.

 

애너테이션 정보를 읽는 방법

애너테이션의 정보를 읽기위해 자바 리플렉션을 이용한다.

 

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