1

我有三个文件:

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 的类文件。

该代码在使用 JDK 1.4 时运行良好,但在使用 JDK 1.5 时,类型转换(到 ScriptProcessor)失败并出现 java.lang.ClassCastException。

有人可以告诉我如何解决这个问题。

谢谢,拉吉

4

2 回答 2

1

您需要使当前的类加载器成为您正在加载的新类加载器的父级,并确保您的 jar 中没有接口的副本。

您遇到的问题表明您有两个接口副本:一个在主类加载器中,一个在新类加载器中。返回的对象使用单独 jar 中的对象,但您的类使用的是主要对象。他们不一样。您必须确保 Java 在处理加载的类时使用与编译代码时相同的“.class”接口。

首先要做的是在罐子上加上“jar tf”,看看我的两份假设是否正确。如果是这样,请将其删除。尝试跑步。如果您现在获得 NoClassDef,请修复加载器的构造。

new URLClassLoader(urlArray, Thread.currentThread().getContextClassLoader());

假设您的环境维护上下文类加载器。或者,

new URLClassLoader(urlArray, ScriptProcessor.class.getClassLoader());
于 2011-08-30T10:19:08.127 回答
0

尝试使用:

loader.loadClass("ScriptProcessorDummy", true).newInstance();

布尔值告诉类加载器解析类名。

于 2011-08-30T01:58:32.303 回答