자바에서 클래스 정보 알아내는 법
- 자바에서 클래스 정보를 가져오기 위해 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 타입으로 결과를 반환
- getMethod()로 메서드 정보를 얻은 후, invoke()로 해당 메서드를 실행
- 이러한 동적 특성 때문에 컴파일 시점에 메서드 정보가 확정되지 않아 JIT 컴파일러가 최적화를 수행할 수 없고, 그 결과 일반 메서드 호출보다 성능이 떨어지게 됨
- 단, 이 부분은 사용 중인 JVM의 버전과 프로그램 상황에 따라 다를 수 있음