리플렉션
리플렉션
NOTE
출처 : 김영한 선생님의 스프링 강의 강의 링크
- 클래스나 메서드의 메타정보를 동적으로 획득하고, 동적으로 호출할 수 있다.
@Test
void reflection2() throws Exception{
//클래스 정보
Class<?> classHello = Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hello");
Hello target = new Hello();
//callA 메서드 정보
Method methodCallA = classHello.getMethod("callA"); //해당 클래스의 callA 메서드 메타정보 획득
dynamicCall(methodCallA, target);
//callB 메서드 정보
Method methodCallB = classHello.getMethod("callB");
dynamicCall(methodCallB, target);
}
private void dynamicCall(Method method, Object target) throws Exception{
log.info("start");
Object result = method.invoke(target); //획득한 메서드 메타정보로 실제 인스턴스의 메서드를 호출
log.info("result={}", result);
}
@Slf4j
static class Hello {
public String callA() {
log.info("callA");
return "A";
}
public String callB() {
log.info("callB");
return "B";
}
}
- 리플렉션을 사용해서 Method라는 메타정보로 추상화가 가능
- 덕분에 공통 로직을 만들 수 있다
주의
- 컴파일 시점에 오류를 잡을 수 없다.
- “callA” 의 문자를 실수로 “callZZ”로 작성해도 컴파일 오류가 발생하지 않고 런타임 오류가 발생
- 프로그래밍 언어가 타입정보를 기반으로 컴파일 시점에 오류를 잡아준 덕분에 편하게 개발 가능했는데 리플렉션은 그것에 역행하는 방식
- 리플렉션은 프레임워크 개발이나 또는 매우 일반적인 공통 처리가 필요할 때 부분적으로 주의해서 사용