스프링 - Reflection(리플렉션)

salgu·2022년 1월 3일
0

Spring

목록 보기
15/22

JDK 동적 프록시를 이해하기 위해서 자바의 리플렉션에 대해서 알아보겠습니다.
리플렉션이란 클래스와 메소드의 메타정보를 동적으로 획득하고 코드를 동적으로 호출할 수 있습니다.

Hello class

class Hello {
    public String callA() {
        log.info("Call A");
        return "A";
    }
    public String callB() {
        log.info("Call B");
        return "B";
    }
}

Dynamic call

private void dynamicCall(Method method, Object target) throws InvocationTargetException, IllegalAccessException {
    log.info("start");
    Object result = method.invoke(target);  // 추상화
    log.info("result -> {}", result);
}

Test Code

@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 : 김영한 선생님

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글