Dynamic Proxy

런타임에 특정 인터페이스들을 구현하는 클래스 또는 인스턴스를 만드는 기술

생성 방법

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler)

loader : 프록시 클래스를 정의하기 위한 클래스 로더
interfaces : 구현하고자 하는 인터페이스 목록
handler : 실제로 프록시 객체에서 수행할 작업을 정의한 핸들러 객체

예제

BookService bookService = (BookService) Proxy.newProxyInstance(BookService.class.getClassLoader(), new Class[]{BookService.class},
            new InvocationHandler() {
                BookService bookService = new BookServiceImpl();
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    // 특정 메소드만 적용하고 싶다면 조건문을 추가해야한다.
                    // rent 메소드만 앞뒤로 출력을 덧붙이도록 한다
                    if(!method.getName().equals("rent")) {
                        return method.invoke(bookService, args);
                    }
                    System.out.println("aaa");
                    Object invoke = method.invoke(bookService, args);
                    System.out.println("bbb");
                    return invoke;
                }
            });

    @Test
    public void rent() {
        Book book = new Book();
        book.setTitle("spring");
        bookService.rent(book);
        bookService.returnBook(book);
    }

단 인터페이스만 적용할 수 있다

예제는 이곳 에서 확인하실수 있습니다.