서블릿에 플러그인 시스템을 구현하려고합니다. 나는 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<pluginName.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 문제를 만들었습니다
귀하의 설명을 이해하지만 왜 자바 표준 응용 프로그램에서이 코드를 사용해도 작동합니까? – scarankle
표준 Java 응용 프로그램에서는 기본 클래스 로더가 완전히 다르기 때문에 두 CL 사이의 운 좋은 간섭으로 인해 작동하고 있다고 가정합니다. 또는 서블릿 컨테이너 케이스에 불운으로 인해 작동하지 않습니다. 명시적인 부모 클래스 로더를'URLClassloader'에 건네줍니다. 이 경우 부모는 무엇입니까? –
URLClassloader에서 기본 클래스 로더를 전달하면 문제가 해결되었다고 설명해 주셔서 감사합니다. 좋은 하루 보내십시오 – scarankle