구체적인 클래스 타입을 알지 못해도 해당 클래스의 객체 생성, 메소드, 타입, 변수들에 접근할수 있도록 도와주는 Java API이다. 로컬에 객체가 없고 자료형을 알 수 없는 경우 유용한 프로그래밍 방식이다. java.lang.reflect 패키지에 있는 클래스를 활용한다.
동적으로 클래스를 사용해야 할때 필요하다. 즉, 작성 시점에는 어떤 클래스를 사용해야 할지 모르는 경우, 런타임 시점에서 클래스를 가져와서 실행해야 하는 경우에 사용된다. 대표적으로 IntelliJ의 자동완성이나 Spring 프레임워크의 어노테이션 같은 기능들이 리플렉션을 이용해서 프로그램 실행 중 동적으로 클래스 정보를 가져와서 사용하는 예이다.
자바 클래스 파일은 프로그램 생성시에 힙 영역에 저장된다. 그래서 클래스 이름만 알고 있다면 언제든 이 영역에 들어가서 클래스의 정보를 가져올수 있다. 외부에 공개되지 않는 private 멤버도 접근과 조작이 가능하므로 주의해야한다. setAccessible(boolean flag)를 true로 하면 private 멤버변수나 메서드에 접근할 수 있다.
Class 클래스 (java.lang.class)를 통해 클래스의 객체를 받아오는 3가지 방법이 있다.
1) .class를 붙여 해당 클래스를 바로 참조하는 방법
Class reflectionClass = ReflectionTest.class;
2) 객체 생성 후 getClass() 메서드를 이용하는 방법
ReflectionTest reflectionTest = new ReflectionTest();
Class reflectionClass = reflectionTest.getClass();
3) ForName() 메서드를 이용하여 괄호 안에 적힌 클래스를 로드하는 방법
Class reflectionClass = Class.forName("com.example.study.ReflectionTest");