ETC

[10분 테코톡] 헙크의 자바 Reflectio

버스는그만 2023. 8. 6. 19:57

리플렉션이란?

  • 어원: 반사하다, 비치다
  • 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능

동작원리

JVM 이미지

  • java 파일이 class 파일로 바뀌면서 컴파일러가 컴파일 후 바이트 코드가 된다.
  • 메서드 에어리어 클래스에 대한 메타 정보가 들어간다. 이 메서드 에어리어에 메타데이터를 가지고 클래스를 검사하고 조작하는 기능을 리플렉션이다.

사용방법

Class

  • 메서드 영역의 클래스 및 인터페이스 정보를 가져오는 클래스
  • 이 클래스를 통해서 아래와 같이 3가지 방법을 통해 인스턴스를 생성할 수 있다.
public static void main(String[] args) throws ClassNotFoundException {
        // 1
        final Class<MyClass> class1 = MyClass.class;
        
        
        // 2
        final MyClass o = new MyClass();
        final Class<? extends  MyClass>  class2 = o.getClass();
        
        // 3
        final Class<?> class3 = Class.forName("com.example.MyClass");
    }
  1. 클래스 타입.class
  2. 인스턴스.getClass()
  3. Class.forName('패키지 경로')

리플렉션으로 어떤 정보를 가져올 수 있을까?

  • 필드
  • 메서드
  • 생성자
  • enum
  • Annotation
  • 배열
  • 부모 클래스와 인터페이스

이번편에서는 필드, 메서드, 생성자만 다룬다.

  참조 범위 접근 제어자
getXXXs 자신과 상위 클래스 public만
getDeclaredXXXs 자신 모두
  • getXXXs : 해당 클래스와 상위 클래스에 있는 public 요소들만 가져옴
  • getDelaredXXXs : 접근 제한자와 상관 없이 해당 클래스의 모든 요소를 가져옴

단, private 한 필드, 메서드에 접근할 경우 해당 객체의 setAccessable(true) 해줘야한다.

리플렉션과 전략 패턴 활용

public static void main(String[] args) throws Exception {
        final Class<?> class1 = Class.forName(args[0]);
        final Constructor<?> constructor = class1.getDeclaredConstructor();
        final MyClass myClass = (MyClass) constructor.newInstance();
        System.out.println(myClass.getName());
    }

위와 같이 환경 변수를 통해서 if 문 없이 전략 패턴을 사용할 수 있다.

리플렉션의 단점

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

마무리

리플렉션을 사용하면 OOP의 개념을 지킬 필요 없는 것이 아닌가?

후기

정말 간단히만 알아본 것이고 리플렉션은 앞으로 더 많이 알아봐야겠다.

참고자료

[10분 테코톡] 헙크의 자바 Reflection

[JVM 이미지]: https://dev-jj.tistory.com/entry/JAVA-JVM%EC%9D%98-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C-%EB%B0%8F-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC