[ClassLoader 퀴즈 3] Whiteship은 Whiteship일까 아닐까?
퀴즈 2번 문제의 정답을 맞추신 분이라면 클래스패스와 클래스로더의 관계에 대해 잘 알고 계신 것 같습니다. temp 폴더는 클래스패스에 들어있지 않다고 했었죠. 따라서 URLClassLoader.loadClass를 실행했을 때 그것의 상위 클래스로더인 AppClassLoader가 읽어오지 못하고 자기 자신이 가져오게 됩니다.
따라서 결국 제가 원하던대로 whiteshipClass1과 whtieshipClass2는 각각 다른 클래스로더(uCL1, uCL2)들이 가져오게 됐습니다.
이쯤 말씀드렸으니.. 정답은 뭐... 당연한 거니까 패스.
@Test(expected = ClassCastException.class)
public void classCastException() throws Exception {
URL url = new URL("file:C:/intellij9-workspace/springsprout2/temp/");
URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
Class whiteshipClass1 = uCL1.loadClass("Whiteship");
Object whiteship1 = whiteshipClass1.newInstance();
URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
Class whiteshipClass2 = uCL2.loadClass("Whiteship");
Object whiteship2 = whiteshipClass2.newInstance();
assertThat(whiteshipClass1, is(not(whiteshipClass2)));
whiteshipClass1.cast(whiteship2);
}
이번에는 주관식입니다.
위 테스트는 통과 합니다.왜 통과하는 걸까요?
즉, 왜 ClassCastException이 발생하는 걸까요?