[JAVA] Reflection 이란
- 컴파일된 자바 코드에서 역으로 클래스를 불러 클래스의 정보를 구해오는 방법
- 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보에 접근할 수 있게 해주는 자바 API
- 클래스를 동적으로 로딩하여 사용할 떄 많이 사용되고, 디컴파일할 때에도 자주 사용되는 기법
Method[] m = c.getMethods();
Field[] f = c.getFields();
Constructor[] cs = c.getConstructors();
Class[] inter = c.getInterfaces();
Class superClass = c.getSuperclass();
왜 사용할까?
클래스의 패키지정보, 접근 지정자, 슈퍼 클래스, 어노테이션을 얻을 수 있다.
Spring을 사용하면 객체가 호출 될 당시 객체의 인스턴스를 생성하는데 이 때 필요한 기술이 Reflection이다.
어떻게 가능할까?
- 자바에서는 JVM이 실행되면 java code가 bytecode로 변환되어 static 영역에 저장된다. Reflection API는 이 정보를 활용하여 정보를 가져온다.
어떻게 활용할까?
- 사용하지 않을 수 있으면 사용하지 않는게 좋다.
- 런타임에 타입을 분석하고 정보를 가져오므로 성능에 좋지않고, private을 봄으로써 추상화가 깨진다.
- 그래서 보통, 프레임워크나 라이브러리 개발에 많이 사용된다. 그 이유는, 사용자가 어떤 클래스를 만들지 예측할 수 없기 때문이다.
- Spring Container인 BeanFactory도 Reflection을 사용한다.
- Spring Data JPA에서도 기본 생성자가 필요한 이유가 Reflection API를 활용하기 때문이다. Reflection API로 가져올 수 없는 정보중 하나가 생성자의 인자 정보다. 그래서 기본생성자가 무조건 있어야 객체를 생성할 수 있다.