가격을 가져온다.
한국 돈으로 책은 6500원 이며,
일본 돈으로 책은 650엔 이다.
다른 물건도 단순히 '원 / 10 = 엔' 의 공식으로 값이 나오도록 적용한다.
우선 테스트를 작성한다.
import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.is; import java.lang.reflect.Proxy; import org.junit.Test; public class PriceTest { @Test public void getPrice(){ Price koreanPrice = new KoreanPrice(); assertThat(koreanPrice.getBookPrice(), is(6500)); assertThat(koreanPrice.getCarPrice(), is(26000000)); assertThat(koreanPrice.getPenPrice(), is(1200)); Price japanPrice = (Price)Proxy.newProxyInstance( getClass().getClassLoader() , new Class[]{Price.class} , new JapanPrice(new KoreanPrice())); assertThat(japanPrice.getBookPrice(), is(650)); assertThat(japanPrice.getCarPrice(), is(2600000)); assertThat(japanPrice.getPenPrice(), is(120)); } }
Price 인터페이스
public interface Price{ int getBookPrice(); int getCarPrice(); int getPenPrice(); }
원(W)화로 계산해주는 클래스
public class KoreanPrice implements Price { @Override public int getBookPrice() { return 6500; } @Override public int getCarPrice() { return 26000000; } @Override public int getPenPrice() { return 1200; } }
Proxy를 이용해 엔화로 계산해 주기 위한 클래스
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class JapanPrice implements InvocationHandler { Object price; public JapanPrice(Object price) { this.price = price; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = method.invoke(price, args); return ((Integer) obj) / 10;//단순히 10 나누기 } }
책값만 엔화로 계산해 주기 테스트
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class JapanPrice implements InvocationHandler { Object price; public JapanPrice(Object price) { this.price = price; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = method.invoke(price, args); if(obj instanceof Integer && method.getName().indexOf("Book") != -1) { return ((Integer)obj) / 10; } return (Integer) obj; } }
import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.is; import java.lang.reflect.Proxy; import org.junit.Test; public class PriceTest { @Test public void getPrice(){ Price koreanPrice = new KoreanPrice(); assertThat(koreanPrice.getBookPrice(), is(6500)); assertThat(koreanPrice.getCarPrice(), is(26000000)); assertThat(koreanPrice.getPenPrice(), is(1200)); Price japanPrice = (Price)Proxy.newProxyInstance( getClass().getClassLoader() , new Class[]{Price.class} , new JapanPrice(new KoreanPrice())); assertThat(japanPrice.getBookPrice(), is(650)); assertThat(japanPrice.getCarPrice(), is(26000000)); assertThat(japanPrice.getPenPrice(), is(1200)); } }
'Spring' 카테고리의 다른 글
jsp 에서 applicationcontext 얻어와서 getBean 사용하기. (0) | 2012.11.13 |
---|---|
[Spring] java.lang.reflect.Method 테스트 해보기 (0) | 2012.11.06 |