JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[토비의 스프링] 6.3.2_invocationhandler에 여러개의 부가기능 추가 #110

Closed taxol1203 closed 3 years ago

taxol1203 commented 3 years ago

타깃에 데코레이터기 위해 프록시를 적용하는 예제를 보면, Invocationhandler에 부가기능을 추가하여 다이내믹 프록시에서 위 핸들러에 메서드 처리를 요청 하는 방식으로 동작합니다.

예를들어, 예제에서는 UppercaseHandler를 통해 문자열을 대문자로 바꾸어 주는데, 다음과 같은 코드로 동작합니다.

public class UppercaseHandler implements InvocationHandler {
    private Hello target;

    public UppercaseHandler(Hello target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object ret = method.invoke(target, args);

        if (ret instanceof String && method.getName().startsWith("say")) {
            return ((String) ret).toUpperCase();
        }
        return ret;
    }
}

만약 대문자로 만드는 기능 외에, 소문자로 만드는 기능을 하는 데코레이터 패턴도 만들고 싶다면, invoke 메서드 내에서 조건문을 통해 기능을 구현해야 할까요?

daebalprime commented 3 years ago

새로운 InvocationHandler 구현 클래스를 만드는 것으로 가능합니다. 데코레이터와 InvocationHandler 구현 클래스가 1:1 대응한다고 생각하시면 되겠습니다.