JDK 동적 프록시를 이해하기 위해서 자바의 리플렉션에 대해서 알아보겠습니다.
리플렉션이란 클래스와 메소드의 메타정보를 동적으로 획득하고 코드를 동적으로 호출할 수 있습니다.
class Hello {
public String callA() {
log.info("Call A");
return "A";
}
public String callB() {
log.info("Call B");
return "B";
}
}
private void dynamicCall(Method method, Object target) throws InvocationTargetException, IllegalAccessException {
log.info("start");
Object result = method.invoke(target); // 추상화
log.info("result -> {}", result);
}
@Test
public void reflection2() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> classHello = Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hello");
Method callA = classHello.getMethod("callA");
Method callB = classHello.getMethod("callB");
Hello hello = new Hello();
dynamicCall(callA, hello);
dynamicCall(callB, hello);
}
callA 메소드와 callB 메소드를 리플렉션을 사용해서 Method의 메타정보로 추상화 하였습니다.
- 리플렉션은 클래스와 메소드의 메타데이터를 사용하여 동적으로 만들 수 있지만
런타임때 동작하기 때문에 컴파일 시점에 오류를 잡을 수 없기때문에 일반적으로 사용하지 않는것을 권장합니다.
reference : 김영한 선생님