아무거나

리플렉션(Reflection) 이란? 본문

Java & Kotlin/Java

리플렉션(Reflection) 이란?

전봉근 2021. 5. 3. 02:50
반응형

리플렉션(Reflection)

  • 정의: 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API
  • 코드설명
    public class Pizza {
        public void eat() {
            ...
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Object pizza = new Pizza();
            pizza.eat();  // 컴파일 에러
        }
    }
    
    • 위의 코드에서 컴파일 에러가 나는 이유는 모든 클래스의 조상 클래스인 Object라는 타입으로 Pizza 클래스의 인스턴스를 담을 수는 있지만 사용 가능한 메소드는 Object의 메소드와 변수들 뿐이기 때문이다. 이와 같이 구체적인 타입의 클래스를 모를 때 사용하는게 리플렉션이다. (런타임에 지금 실행되고 있는 클래스를 가져와서 실행)
  • 예시
    • 테스트
      [RefObject.java]
      import lombok.Getter;
      import lombok.Setter;
      
      @Getter
      @Setter
      public class RefUserObject {
      
          private int userNo;
          private String userName;
      
      }
      
      [ReflectionController.java]
      ...
      try {
          Class<?> clazz = RefUserObject.class;
      
          Field[] fields = clazz.getDeclaredFields();
          for (Field field: fields) {
              log.info(">>>>>>>>>>>>>>>>>>>>>>>>> Field Name: {}", field.getName());
          }
      
          Field field = clazz.getDeclaredField("userNo");
      
          // 컴파일시 cannot access a member of class ... with modifiers "private" 에러를 표시하지 않기 위해 추가
          field.setAccessible(true);
      
          // 필드값을 다루기 위한, 객체 생성
          RefUserObject refUserObject = new RefUserObject();
          field.set(refUserObject, 3);
          int userNo = (int) field.get(refUserObject);
          log.info(">>>>>>>>>>>>>>>>>>>>>>>>> userNo: {}", userNo);
      } catch (NoSuchFieldException nsfe) {
          log.error("NoSuchFieldException Error: {}", nsfe);
      } catch (SecurityException se) {
          log.error("SecurityException Error: {}", se);
      } catch (Exception e) {
          log.error("Exception Error: {}", e);
      }   
      ...
      
반응형
Comments