# 자바에서 클래스 정보 알아내는 법

  • 자바에서 클래스 정보를 가져오기 위해 Reflection API 사용 가능
  • Reflection API로 JVM에 로딩되어 있는 클래스와 메서드의 정보를 읽어올 수 있음
  • 대표적으로 Class 클래스, Method 클래스, Field 클래스 존재

# Reflecction API의 단점

  • Reflection API를 통해 동적으로 클래스 정보에 접근이 가능하지만, 일반적인 코드보다 복잡한 코드가 필요할 수 있음
  • 캡슐화가 약화되어 강결합으로 이어질 수 있음
  • 일반적인 메서드 호출과 Method 클래스의 invoke 호출의 성능을 비교했을 때, JIT 최적화가 어려워질 수 있어 일반적인 메서드 호출보다 성능이 저하될 수 있음

# Method.invoke()

  • Java Reflection API에서 런타임에 동적으로 메서드를 호출하는 기능
  • Method.invoke()는 두 개의 매개변수를 받음
    • 첫 번째 매개변수: 메서드를 호출할 객체 인스턴스 (static 메서드의 경우 null)
    • 두 번째 매개변수: 메서드 실행에 필요한 인자들을 담은 Object[] 배열
  • 메서드가 반환값을 가지면 Object 타입으로 결과를 반환
// 일반적인 메서드 호출
String result = myObject.sayHello("World");

// Method.invoke()를 사용한 호출
Method method = MyClass.class.getMethod("sayHello", String.class);
Object result = method.invoke(myObject, "World");
  • getMethod()로 메서드 정보를 얻은 후, invoke()로 해당 메서드를 실행
  • 이러한 동적 특성 때문에 컴파일 시점에 메서드 정보가 확정되지 않아 JIT 컴파일러가 최적화를 수행할 수 없고, 그 결과 일반 메서드 호출보다 성능이 떨어지게 됨
  • 단, 이 부분은 사용 중인 JVM의 버전과 프로그램 상황에 따라 다를 수 있음