-
애노테이션과 리플랙션백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 14. 12:56반응형
애노테이션이란?
- 어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소
- 근본적으로 주석이랑 같은 취급을 받는다.
- 기본적으로 클래스와 소스에서 정보가 존재하지만 바이트를 로딩하였을 때 메모리 상에는 남지 않는다.
중요 애노테이션
@Retention
- 해당 애노테이션을 언제까지 유지할 것인가? 소스, 클래스, 런타임
@Inherit
- 해당 애노테이션을 하위 클래스까지 전달할 것인가?
@Target
- 어디에 사용할 수 있는가?
@Override
- 선언한 메서드가 오버라이드 됨을 표시
- 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생
@Deprecated
- 해당 메서드가 더 이상 사용되지 않음을 표시
- 만약 사용할 경우 컴파일 경고를 발생
@SuppressWarnings
- 선언한 곳의 컴파일 경고를 무시
리플렉션
getAnnotations()
상속받은 (@Inherit) 애노테이션까지 조회
getDeclaredAnnotations()
자기 자신에만 붙어있는 애노테이션 조회
예시
Book.java에 MyAnnotation을 붙였는데 name과 number의 값을 넣어줘야 한다. 그 이유는 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()); } }); }); } }
반응형'백기선(인프런 강의) > 더 자바, 코드를 조작하는 다양한 방법' 카테고리의 다른 글
클래스의 프록시 (0) 2020.06.16 다이내믹 프록시 (0) 2020.06.16 리플렉션 정리 (0) 2020.06.14 리플렉션 API 1부: 클래스 정보 수정 또는 실행 (0) 2020.06.14 리플렉션 API 1부: 클래스 정보 조회 (0) 2020.06.09