ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 애노테이션과 리플랙션
    백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 14. 12:56
    반응형

    애노테이션이란? 

    • 어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소
    • 근본적으로 주석이랑 같은 취급을 받는다.
    • 기본적으로 클래스와 소스에서 정보가 존재하지만 바이트를 로딩하였을 때 메모리 상에는 남지 않는다. 

     

    중요 애노테이션

    @Retention

    • 해당 애노테이션을 언제까지 유지할 것인가? 소스, 클래스, 런타임

     

    @Inherit

    • 해당 애노테이션을 하위 클래스까지 전달할 것인가?

     

    @Target

    • 어디에 사용할 수 있는가?

     

    @Override

    • 선언한 메서드가 오버라이드 됨을 표시
    • 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생

     

    @Deprecated

    • 해당 메서드가 더 이상 사용되지 않음을 표시
    • 만약 사용할 경우 컴파일 경고를 발생

     

    @SuppressWarnings

    • 선언한 곳의 컴파일 경고를 무시

     

     

    리플렉션

    getAnnotations()

    상속받은 (@Inherit) 애노테이션까지 조회

     

    getDeclaredAnnotations()

    자기 자신에만 붙어있는 애노테이션 조회

     

    예시

    Book.javaMyAnnotation을 붙였는데 namenumber의 값을 넣어줘야 한다. 그 이유는 MyAnnotation 인터페이스 부분에 값에 설정되지 않았기 때문이다. MyAnnotation 인터페이스에 default로 값을 넣었다면 상관이 없다.

     

    추가

     MyAnnotation에 변수명이 value로 하나만 설정되어있으면 Book.java에서 기본값을 설정할 때 이름을 넣지 않아도 된다. 

    package kr.co.study;
    
    @MyAnnotation(name = "JinSeok", number = 30, value = "Test")
    public class Book {
    	private String a = "a";
    	
    	private static String B = "BOOK";
    	private static final String C = "BOOK";
    
    	public String d = "d";
    	protected String e = "e";
    
    	public Book() {
    
    	}
    
    	public Book(String a, String d, String e) {
    		super();
    		this.a = a;
    		this.d = d;
    		this.e = e;
    	}
    
    	private void f() {
    		System.out.println("F");
    	}
    
    	public void g() {
    		System.out.println("g");
    	}
    
    	public int h() {
    		return 100;
    	}
    }

     

    @Retention(RetentionPolicy.CLASS)
    @Target({ ElementType.TYPE, ElementType.FIELD })
    public @interface MyAnnotation {
    //	String name() default "JinSeok";
    
    //	int number() default 100
    	String name();
    	int number();
    	String value();
    }
    

     

    public class MyBook extends Book implements MyInterface {
    
    }

     

    public interface MyInterface {
    
    }

     

    public class RunMain {
    
    	public static void main(String[] args) throws ClassNotFoundException {
    		Arrays.stream(Book.class.getDeclaredFields()).forEach(f -> {
    			Arrays.stream(f.getAnnotations()).forEach(a -> {
    				if(a instanceof MyAnnotation) {
    					MyAnnotation myAnnotation = (MyAnnotation) a;
    					System.out.println(myAnnotation.value());
    					System.out.println(myAnnotation.value());
    				}
    			});
    		});
    	}
    }

     

    Retention 사용후 존재하지 확안(class)

     

     

     

     

     

     

     

    반응형
Designed by Tistory.