JAVA Reflection 

 
  • Reflection은 런타임에 메서드, 클래스 및 인터페이스의 동작을 검사하거나 수정하는 데 사용되는 API
  • 리플렉션에 필요한 클래스는 리플렉션을 이해하는 데 필수적인 java.lang.reflect 패키지에 존재
 
  • 리플렉션은 객체가 속한 클래스에 대한 정보와 객체를 사용하여 실행할 수 있는 해당 클래스의 메서드에 대한 정보를 제공합니다.
  • 리플렉션을 통해 사용된 접근 지정자(access specifier)와 상관없이 런타임에 메서드를 호출할 수 있습니다.
 
  • 리플렉션은 클래스, 생성자 및 메서드에 대한 정보를 가져오는 데 사용할 수 있습니다.
ClassConstructorsMethods
 The getClass() method is used to get the name of the class to which an object belongs.
The getConstructors() method is used to get the public constructors of the class to which an object belongs.
The getMethods() method is used to get the public methods of the class to which an object belong

 
이름과 매개변수 유형을 알고 있으면 리플렉션을 통해 메서드를 호출할 수 있습니다. 
 

getDeclaredMethod()

  • 호출할 메서드의 개체를 만듭니다.
Class.getDeclaredMethod(name, parametertype)
Parameters:
  • 객체를 생성할 메서드의 이름
  • 클래스 객체의 배열

 

invoke()

  • 런타임에 다음 메서드를 사용하는 클래스의 메서드를 호출합니다.
Method.invoke(Object, parameter)
  • 클래스의 메서드가 매개 변수를 허용하지 않으면 null이 인수로 전달됩니다.

 
리플렉션을 통해 클래스 개체의 도움으로 클래스의 개인 변수 및 메서드에 액세스하고 위에서 설명한 개체를 사용하여 메서드를 호출할 수 있습니다. 
 

Class.getDeclaredField(FieldName)

  • 프라이빗 필드를 가져오는 데 사용됩니다. 지정된 필드 이름에 대해 Field 유형의 객체를 반환합니다.
 

Field.setAccessible(true)

  • 필드와 함께 사용되는 접근제한자(access modifier)와 상관없이 필드에 액세스할 수 있습니다
 

 

Reflection API의 특징

  • Extensibility Features: 응용 프로그램은 정규화된 이름을 사용하여 확장성 개체의 인스턴스를 만들어 외부 사용자 정의 클래스를 사용할 수 있습니다.
  • Debugging and testing tools: 디버거는 리플렉션 속성을 사용하여 클래스의 전용 멤버를 검사합니다.
  • Performance Overhead: Reflective 작업은 상대적으로 성능이 느리므로 성능에 민감한 애플리케이션에서 자주 호출되는 코드 섹션에서는 피해야 합니다.
  • Exposure of Internals: 반영 코드는 추상화를 깨뜨리므로 플랫폼 업그레이드로 동작이 변경될 수 있습니다.
 

 

참고자료

 
 

+ Recent posts