ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Reflection
    Programming Language/Java & Kotlin 2024. 12. 11. 20:45
    반응형

    리플렉션이란?

    • reflect: 반사하다, 비치다
    • 거울에 반사된 고양이가 있다고 가정하자.
      • 여기서 고양이는 '클래스', 거울에 반사된 고양이는 'JVM 메모리 영역의 정보'에 해당
    • 정의: 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능

     

    컴파일 타임과 런타임

    • 컴파일 타임: 스냅샷
    • 런타임: 상호 작용

     

    리플렉션 다시보기

    • 프로그램 실행 중에 사용자와 운영체제 및 기타 프로그램과 상호작용하면서 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능

     

    리플렉션 동작 원리

    • Class: 메서드 영역의 클래스 및 인터페이스 정보를 가져오는 클래스
    • 리플렉션으로 어떤 정보를 얻을 수 있는가?
      • 필드
      • 메서드
      • 생성자
      • Enum
      • Annotation
      • 배열
      • 부모 클래스와 인터페이스

     

    필요한 값 가져오기

      참조범위 접근제어자
    getXXXs 자신과 상위 클래스 public만
    getDeclaredXXXs 자신 모두

     

    리플렉션 사용법

    class MyClass {
        private final String name = "제로";
    }
    
    public class Main {
        public static void main(String[] args) throws Exception {
            final Class<MyClass> clazz = MyClass.class;
            final Field declaredField = clazz.getDeclaredField("name");
            declaredField.setAccessible(true);
    
            final MyClass myClass = new MyClass();
            final String name = (String) declaredField.get(myClass);
    
            System.out.println("name = " + name);
        }
    }
    

    리플렉션의 단점

    • 보안 취약점
    • 코드 복잡도 증가
    • 성능 저하
    • 최적화 방해
    • 타입 안정성
    • 호환성

     

    리플렉션을 사용해야하는가? vs 사용하지 말아야하는가?

    • 프레임워크 및 라이브러리 제공자: 런타임에 사용자와 상호작용하면서 기능을 제공하고 싶은 경우 한정적으로 사용
    • 일반 사용자: 되도록이면 사용을 지양. 정말 필요한 곳에서만 적절하게 사용. 리플렉션으로 인한 피해는 모두 사용자 책임

     

    참고

    • 우아한 테크톡 <자바 리플렉션> 

     

     

    반응형
Designed by Tistory.