[ClassLoader 퀴즈 2] Whiteship은 내가 데려왔다!!
첫번째 문제를 맞추셨다면 클래스로더 계층 구조를 이해하고 있다고 볼 수 있겠습니다. 제가 작성한 코드를
보면 제가 어떤걸 원했는지 짐작하실 수 있을 겁니다.
@Test
public void loadLocal() throws Exception {
URL url = new URL("file:C:/intellij9-workspace/springsprout2/test/sandbox/classloader");
URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
Class whiteshipClass1 = uCL1.loadClass("sandbox.classloader.Whiteship");
URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
Class whiteshipClass2 = uCL2.loadClass("sandbox.classloader.Whiteship");
System.out.println("URLClassLoader1: " + uCL1);
System.out.println("URLClassLoader2: " + uCL2);
System.out.println("URLClassLoader1's parent : " + uCL1.getParent());
System.out.println("URLClassLoader2's parent : " + uCL2.getParent());
System.out.println("whiteshipClass1 loaded by: " + whiteshipClass1.getClassLoader());
System.out.println("whiteshipClass2 loaded by: " + whiteshipClass2.getClassLoader());
}
whiteshipClass1과 whiteshipClass2를 각기 다른 ClassLoader(URLClassLoader)를 사용해서 가져오고 싶었던 겁니다. 하지만 결과는? 두 클래스 모두 uCL1과 uCL2의 상위 클래스로더가 가져왔기 때문에 정답은 5번이며 제가 원하던 대로 동작하지 않았습니다. 좀 더 정확하게 보고 싶으시다면 위와 같이 uCL1과 uCL2의 parent까지 찍어보시면 C3, C4와 같다는 걸 확인할 수 있을 겁니다.
@Test
public void load() throws Exception {
URL url = new URL("file:C:/intellij9-workspace/springsprout2/temp/");
URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
Class whiteshipClass1 = uCL1.loadClass("Whiteship");
URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
Class whiteshipClass2 = uCL2.loadClass("Whiteship");
System.out.println("URLClassLoader1: " + uCL1); // C1
System.out.println("URLClassLoader2: " + uCL2); // C2
System.out.println("URLClassLoader1's parent : " + uCL1.getParent()); // C3
System.out.println("URLClassLoader2's parent : " + uCL2.getParent()); // C4
System.out.println("whiteshipClass1 loaded by: " + whiteshipClass1.getClassLoader()); // C5
System.out.println("whiteshipClass2 loaded by: " + whiteshipClass2.getClassLoader()); // C6
}
자 이번에는 조금 다릅니다. temp라는 폴더는 클래스패스로 잡혀있지 않습니다. 그 안에 Whtieship.java를 넣어뒀고 콘솔에서 컴파일해서 .class 파일을 만들어뒀습니다.
다음 중 참인 것은?
1. C1과 C5가 같다.
2. C2과 C6이 같다.
3. C3과 C5가 같다.
4. C4와 C6이 같다.
5. C3과 C4가 같다.
6. C5와 C6이 같다.
과연 이번에는 내가 원했던 결과를 얻을려나...
정답은 역시 다음 글에서 공개. to be continued~!