[ClassLoader 퀴즈 4] SpringSprout가 알고 있는 Whiteship은 누구인가?
퀴즈 3번을 다시 낸거라 생각히셔도 되겠습니다. 2, 3번을 푸셨다면 이 문제도 역시 간단하게 푸실 수 있을 겁니다.
@Test
public void classCastException() throws Exception {
URLClassLoader uCL1 = new FileUrlClassLoader(TEMP_CLASSPATH);
Class springSproutClass = uCL1.loadClass(TEMP_SPRING_SPROUT);
Object springSprout = springSproutClass.newInstance();
Class whiteshipClass1 = uCL1.loadClass(TEMP_WHITESHIP);
Object whiteship1 = whiteshipClass1.newInstance();
URLClassLoader uCL2 = new FileUrlClassLoader(TEMP_CLASSPATH);
Class whiteshipClass2 = uCL2.loadClass(TEMP_WHITESHIP);
Object whiteship2 = whiteshipClass2.newInstance();
Method cast = springSproutClass.getMethod("castWhiteship", Object.class);
cast.invoke(springSprout, whiteship1); // C1
cast.invoke(springSprout, whiteship2); // C2
}
TEMP_CLASSPATH는 이 프로젝트의 기본 클래스패스가 아닙니다.
TEMP_SPRING_SPROUT는 SpringSprout.java 클래스의 이름이고
TEMP_WHITESHIP은 Whiteship.java 클래스의 이름을 줍니다.
SpringSprout 클래스에 있는 castWhiteship 메서드는 다음과 같습니다.
public void castWhiteship(Object object){
Whiteship2 whiteship = (Whiteship2)object;
}
C1에서는 아무 일 없지만 C2에서는 바로 저 부분에서 ClassCastException이 발생하죠. 그 이유는 퀴즈 3에 대한 답으로 성윤군이 달아줬지요.
그럼 이번 문제는 조금 다르게...
public void hi(Whiteship whipteship){
// 띵까 띵까..
}
SpringSprout에 이런 메서드가 있을 때 저 메서드를 호출할 때 whiteship1와 whiteship2 객체를 각각 전달해 준다면 어떤 일이 벌어질까요?
Method cast =
springSproutClass.getMethod("hi", whiteshipClass1);
cast.invoke(springSprout,
whiteship1); // H1
cast.invoke(springSprout,
whiteship2); // H2