我有三个文件:
ScriptProcessor.java:
public interface ScriptProcessor {
public String someMethod();
}ScriptProcessorDummy.java:
public class ScriptProcessorDummy implements ScriptProcessor {
public String someMethod{
return "some string";
}
}在main方法中,代码执行以下操作:
URLClassLoader loader = null;
loader = new URLClassLoader(new URL[] {new URL("JARFILE")});
if (loader != null) {
ScriptProcessor processor = (ScriptProcessor) loader.loadClass("ScriptProcessorDummy").newInstance();
}JARFILE包含ScriptProcessor和ScriptProcessorDummy的类文件。
代码在使用JDK1.4时运行良好,但在使用JDK1.5时,使用java.lang.ClassCastException的类型转换(到ScriptProcessor)失败。
谁能告诉我怎么解决这个问题。
谢谢,Raj
发布于 2011-08-30 18:19:08
您需要使当前的类加载器成为要加载的新类加载器的父类,并确保jar中没有该接口的副本。
您遇到的问题表明您有两个接口副本:一个在主类加载器中,另一个在新的类加载器中。返回的对象使用单独jar中的对象,但您的类使用的是主对象。它们是不一样的。您必须确保Java在处理加载的类时使用与编译您的代码时相同的'.class‘作为接口。
要做的第一件事是在jar上'jar tf‘,看看我的两个副本的假设是否正确。如果是,请将其删除。试着跑吧。如果您现在获得了NoClassDef,请修复加载器的结构。
new URLClassLoader(urlArray, Thread.currentThread().getContextClassLoader());假设您的环境维护上下文类加载器。或者,
new URLClassLoader(urlArray, ScriptProcessor.class.getClassLoader());发布于 2011-08-30 09:58:32
尝试使用:
loader.loadClass("ScriptProcessorDummy", true).newInstance();布尔值告诉类加载器解析类名。
https://stackoverflow.com/questions/7237902
复制相似问题