[ClassLoader 퀴즈 2] Whiteship은 내가 데려왔다!!
Java : 2010. 2. 19. 16:34
첫번째 문제를 맞추셨다면 클래스로더 계층 구조를 이해하고 있다고 볼 수 있겠습니다. 제가 작성한 코드를
보면 제가 어떤걸 원했는지 짐작하실 수 있을 겁니다.
@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~!
보면 제가 어떤걸 원했는지 짐작하실 수 있을 겁니다.
@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~!
'Java' 카테고리의 다른 글
[ClassLoader 퀴즈 끝] SpringSprout와 WhiteshipFactory가 참조하는 Whiteship은 누구인가. (0) | 2010.02.23 |
---|---|
[ClassLoader 퀴즈 6] SpringSprout는 과연 Whiteship의 이름을 알 수 있을까? (4) | 2010.02.22 |
[ClassLoader 퀴즈 5] Whiteship은 언제 로딩 될까? (2) | 2010.02.22 |
[ClassLoader 퀴즈 4] SpringSprout가 알고 있는 Whiteship은 누구인가? (10) | 2010.02.21 |
[ClassLoader 퀴즈 3] Whiteship은 Whiteship일까 아닐까? (2) | 2010.02.19 |
[ClassLoader 퀴즈 2] Whiteship은 내가 데려왔다!! (5) | 2010.02.19 |
[ClassLoader 퀴즈 1] Whiteship은 대체 누가 데려온 것일까? (8) | 2010.02.19 |
[Java] ClassLoader API (2) | 2010.02.17 |
[NullPE] SpEL 때문에 고민 해결 (0) | 2010.02.10 |
[NullPE] NullPointerException 때문에 고민 1 (2) | 2010.02.10 |
WEB-INF/urlrewrite.xml 파일 설정하기 (0) | 2010.02.09 |
TAG ClassLoader
다른 폴더로 옮겼군요 ;;ㅎㅎ 전 안데리고 왔어요 ㅎㅎ
1 ,2, 5 .. 틀렷으면 오라이 ;; ㅡㅡ;
딩동댕~
여기에 따로 문제를 내었군요. ^^
넵.. 여기에 올린게 트위터로 가고 트위터로 올라간게 버즈로 가는.. ㅋㅋㅋ