2012-04-19 4 views
0

서블릿에 플러그인 시스템을 구현하려고합니다. 나는 URLClassLoader를 사용하여 jar 파일을로드하고 Class.forname을 사용하여 클래스를로드하는 플러그인을로드하는 클래스를 작성했습니다.ClasscastException in servlet



    private void loadPlugin(String[] classToLoad) throws PluginLoaderException{ 
      try{ 
       iTest = (ITest) Class.forName(classToLoad[0],true,loader).newInstance(); 
      } 
      catch(Exception e){ 
       throw new PluginLoaderException(e.toString()); 
      } 
     } 

:



    private void nameToURL(String[] pluginName) throws PluginLoaderException{ 
      try{ 
       for(int i=0;i&ltpluginName.length;i++){ 
        urls[i] = context.getResource(pluginName[i]); 
       } 
      } 

마지막이 하나가 객체를 생성 :



    public PluginLoader(ServletContext context, String[] pluginName, String[] classToLoad) throws PluginLoaderException{ 
      this.context = context; 
      urls= new URL[pluginName.length]; 
      nameToURL(pluginName); 
      //create class loader 
      loader = new URLClassLoader(urls); 
      //loading the plug-in 
      loadPlugin(classToLoad); 
     } 

이 하나의 URL을 초기화 :
이 부분은 URL 클래스 로더를 만들 :
여기 내 코드입니다

내가 개체를 만들 수있게되었으므로 n 그것을 조작하고 그것을 구현 인터페이스를 검색하지만 응용 프로그램에서 그것을 조작하는 ITest에서 그것을 캐스팅 할 수 없습니다. tplugin.toto.Toto를 fr.test.inter.ITest로 캐스팅 할 수 없습니다.
Toto가 ITest를 구현하기 때문에 이상합니다.

누구나 아이디어가 있습니까?

감사

당신은 classoader 문제를 만들었습니다

답변

3

- 당신이 instanceof ITest으로 테스트 할 때, 기본 클래스 로더에 의해로드 ITest의 복사본을 사용하고 있지만 URLClassloader에 의해로드 된 인스턴스를 테스트하고 있습니다. 이 클래스 로더는 ITest이라는 자체 사본을로드했습니다. JVM에 관한 한 완전히 다른 유형입니다.

+0

귀하의 설명을 이해하지만 왜 자바 표준 응용 프로그램에서이 코드를 사용해도 작동합니까? – scarankle

+0

표준 Java 응용 프로그램에서는 기본 클래스 로더가 완전히 다르기 때문에 두 CL 사이의 운 좋은 간섭으로 인해 작동하고 있다고 가정합니다. 또는 서블릿 컨테이너 케이스에 불운으로 인해 작동하지 않습니다. 명시적인 부모 클래스 로더를'URLClassloader'에 건네줍니다. 이 경우 부모는 무엇입니까? –

+0

URLClassloader에서 기본 클래스 로더를 전달하면 문제가 해결되었다고 설명해 주셔서 감사합니다. 좋은 하루 보내십시오 – scarankle