0

我目前正在使用的平台(JDK 1.3,BD-J)受到很大限制。我想尝试使用一个 JAR 文件对负载执行自我完整性检查,如果失败,它将进入不可操作状态。很难找出为什么会发生这种情况,但大多数消息来源指出它无法通过 BD-J 结构自行找到/访问它,因此它死了。

这排除了在加载时使用它,而是在应用程序本身中加载它。这是一个相当大的库,所以我必须创建相当多的接口,以便我可以将加载的对象投射到它并可能使用它。这就是我的问题所在。

接口在正常加载时加载,然后库在运行时加载并转换为先前加载的接口,这是一个问题吗?我收到 ClassCastException

我尽我所能基于库公共方法的接口,但是当我尝试转换为接口时,我收到 ClassCastException。注意:一切正常,我可以访问构造函数并读取方法名称。就在铸造它以使其可用时,它失败了。

我项目中的接口包和工具包的接口包不一样,这有关系吗?

我的想法不多了,有什么我忽略的吗?

谢谢。

4

2 回答 2

0

我不确定我是否完全理解您的问题是什么-也许有关类层次结构的更多详细信息将有助于弄清楚情况。从你写的我可以猜到两种可能的情况:

.1。您要使用的类不实现任何接口。

在这种情况下,无论您如何命名接口,它都不起作用,因为您正在加载的类没有实现它们。如果您无法将该 jar 作为引导类路径的一部分加载,那么您将无法使用反射。

.2. 您想要的类实现您尝试复制的某些接口。

在这种情况下,您的接口实现必须与类正在实现的接口的确切限定名称匹配。通常,当从 jar 加载类时,类加载器会首先从系统类加载器中获取接口,从而加载你的接口,一切都应该工作。

但是,如果他们使用一些疯狂的内部类加载器,他们可能仍会尝试加载自己的接口。您可以尝试使用“-XX:+TraceClassLoading”来确定是否是这种情况,尽管我不知道 1.3 jre 是否会理解该选项。

现在,如果您愿意进行更多尝试,也可以尝试另一种方法。编写您自己的类加载器,从该 jar 加载类和您要运行的代码。这样,您的代码将能够直接引用该 jar 中的类,但要启动您的应用程序,“main”方法必须是初始化此类加载器、使用反射加载“真实”主类并执行的方法它的 main() 方法也通过反射。

于 2010-09-14T06:18:41.383 回答
0

很可能这些类是由不同的类加载器加载的。 http://mindprod.com/jgloss/classloader.html可能会给出一些想法。

于 2010-09-14T06:21:20.390 回答