JAVA

[JAVA] 리플렉션

집한구석 2021. 12. 12. 15:46
728x90

리플렉션 정의

  • 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩하여 생성자, 멤버필드, 멤버 메서드 등을 사용할 수 있게 하는 기능
  • 클래스의 패키지 정보, 접근 지정자, 수퍼클래스, 어노테이션 등을 얻을 수 있음
  • 컴파일 타임이 아니라 런타임에 동적으로 특정 클래스 의 정보를 객체화를 통해 분석 및 추출해줌

사용하는 이유

  • 클래스와 메서드의 메타정보를 사용해서 어플리케이션을 동적으로 유연하게 만들 수 있음
  • private 멤버도 Field.setAccessible() 메서드를 true로 지정하면 접근과 조작이 가능하게 만듬

리플렉션 시작

  • 리플렉션의 시작은 Class<T> 

Class<T>로 통한 접근방법

  • 모든 클래스는 로딩한 다음에 Class<T> 인스턴스가 생기며, 모든 인스턴스는 getClass() 메소드를 가지게 됨
public class Book {
    private String page;
    private String name;
}

import java.util.Arrays;

public class ReflectionStudy {

    public static void main(String[] args) {
        Class<Book> bookClass = Book.class;
        Arrays.stream(bookClass.getDeclaredFields()).forEach(System.out::println);
    }
}
  • 해당 클래스의 필드를 가져오는 예제이며, 메소드, 상위클래스, 인터페이스 등의 정보를 가져올 수 있음

주의사항

  • 리플렉션은 런타임에 동작하기 때문에 컴파일 시점에서 오류를 잡기가 힘들어서 주의해야함 (컴파일 오류는 개발자가 즉시 확인, 런타임 오류는 실행할 때 발생하는 오류라 찾기가 힘듬)
  • 위의 사유로 리플렉션은 일반적으로 사용안하는 것이 좋음 (컴파일 시점에 오류를 잡는 흐름에 역행하는 방식이라서)

리플렉션 사용 예

  • 스프링 : 의존성 주입하는 경우, MVC에 넘어온 뷰를 객체에 바인딩 하는 경우 사용
  • 하이버네이트 : @Entity 클래스에 Setter가 없을 경우 리플렉션을 사용

'JAVA' 카테고리의 다른 글

[JAVA] 람다표현식  (0) 2022.01.01
[JAVA] 제네릭  (0) 2021.12.15
[JAVA] 데코레이터 패턴  (0) 2021.12.10
[JAVA] 프록시패턴  (0) 2021.12.09
[JAVA] ThreadLocal  (0) 2021.12.03