Whiteship's Note

[ClassLoader 퀴즈 4] SpringSprout가 알고 있는 Whiteship은 누구인가?

Java : 2010. 2. 21. 21:29


퀴즈 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


top

  1. Favicon of https://helols.tistory.com BlogIcon is윤군 2010.02.22 11:19 신고 PERM. MOD/DEL REPLY

    //띵까 띵까 ... 이부분에서 무슨일은 안하는거에요 ?

    문제가 그냥 전달했을때 어떻게 되냐 물어보는건가용?

    Favicon of http://whiteship.me BlogIcon 기선 2010.02.22 11:25 PERM MOD/DEL

    ㅇㅇ 잘하면.. 띵까 띵까 놀수도 있고
    안되면 띵까 띵까 놀수 조차 없지.

    왜 못 놀게 될까? 어떤 에러 땜시??

  2. Favicon of http://me2day.net/geekinside BlogIcon 박성철 2010.02.23 14:21 PERM. MOD/DEL REPLY

    오호... 요거 재미있네요.
    전 오류 안 날 것 같은데... 나나요?

    Favicon of http://whiteship.me BlogIcon 기선 2010.02.23 15:20 PERM MOD/DEL

    넵 클래스를 읽어온 로더가 다르기 때문에 전혀 다른 타입으로 보고 ILLEGAL_ARGUMENT_EXCEPTION이 발생한합니다.

    ClassCastException을 재현하고 싶은데 자꾸 저 녀석이 방해를 했었죠.ㅋㅋ

  3. Favicon of http://me2day.net/geekinside BlogIcon 박성철 2010.02.23 14:24 PERM. MOD/DEL REPLY

    아. castWhiteship 안에서 cast를 하는군요.
    전 정말 모르겠는데요. ㅎㅎ

    Favicon of http://whiteship.me BlogIcon 기선 2010.02.23 15:21 PERM MOD/DEL

    cast 하고 싶어서 결국은 Object 타입으로 받았지만.. 실제로 요즘같으면 Object 타입을 매개변수로 받는 건 좀 드물것 같아서..

    ClassCastException 보다는 IAE를 더 자주 보게 되지 않을까 싶네요.

  4. Favicon of http://me2day.net/geekinside BlogIcon 박성철 2010.02.23 16:11 PERM. MOD/DEL REPLY

    방금 해보았는데요.NoClassDefFoundError가 뜨네요. 테스트 코드의 classpath에 Whiteship이 없어서 그러는 것 같은데... 왜 기선님과 다르게 될까요. -_-

    Favicon of http://whiteship.me BlogIcon 기선 2010.02.23 16:15 PERM MOD/DEL

    NoClassDefFoundError는 아마 loadClass 할 때 발생한 것 같은데요. 흠.. 그 부분은 지나가야;; Whiteship 클래스는 TEMP_CLASSPATH에서만 참조할 수 있어야 하고 parent는 몰라야 합니다. TEMP_CLASSPATH를 확인해 확인해 보셔야 될 듯..

    Favicon of http://me2day.net/geekinside BlogIcon 박성철 2010.02.23 20:03 PERM MOD/DEL

    Method cast = springSproutClass.getMethod("hi", Whiteship.class);

    여기에서 NoClassDefFoundError가 납니다.Whiteship class를 이 테스트 케이스가 모르니까요.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2010.02.23 21:24 신고 PERM MOD/DEL

    아.. 맞네요. 맞아!!
    마지막 문제의 코딩해보지 않고 그냥 썼더니.ㅋ

    Whiteship.class 대신 위에서 로딩해온 클래스중 하나로 바꿔야겠군요. whiteshipClass1 로 바꿔두겠습니다.

    감사합니다~

Write a comment.




: 1 : ··· : 11 : 12 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : ··· : 140 :