【发布时间】:2018-06-21 02:50:43
【问题描述】:
我有一个罐子:
/home/cole/lib/a.jar
在这个 jar 中,我有以下接口/类(可怕的名称仅用于说明目的!):
CreatorInterface.javaBase.java (implements CreatorInterface.java)AbstractBase.java (extends Base.java)Implementation.java (extends AbstractBase.java)
在一个单独的项目中,我有以下代码:
final URL[] jars = new URL[] {
new File("/home/cole/lib/a.jar").toURL();
}
final URLClassLoader classLoader = new URLClassLoader(jars, null);
final Class<?> implementation = classLoader.loadClass("Implementation");
final CreatorInterface object = (CreatorInterface)implementation.newInstance();
但是,当我运行上述内容时,我得到以下信息:
java.lang.ClassCastException: Implementation cannot be cast to CreatorInterface
鉴于Implementation 最终是实现CreatorInterface 的类的实例,为什么我会得到ClassCastException?
更新 1
这不是关于使用URLClassLoader的问题,类找到了,问题似乎出在实例化上。例如,以下代码可以正常工作:
final Object object = implementation.newInstance();
更新 2
正如@davidxxx 回答的那样,我有两次接口类(一次在 jar 中,一次在使用它的项目中)。尽管界面相同,但这就是问题的原因。
但是为了让它工作,我需要像这样修复我的 URLClassLoader,以避免出现ClassNotFoundException:
final ClassLoader parent = this.getClass().getClassLoader();
final URLClassLoader classLoader = new URLClassLoader(jars, parent);
【问题讨论】:
-
更新的问题,不这么认为。该类被发现很好,我可以很好地实例化它,但我无法转换它。
-
如果跨多个项目共享,为什么您的 jar 包含接口?当接口实际位于 jar 中时,您的单独项目如何知道接口?接下来,用两个不同的对等类加载器加载同一个类将导致两个不同的类实际上不能来回转换,这可能就是你在这里看到的。
标签: java