我在我正在开发的平台(JDK 1.3,BD-J)中受到很大限制。我想使用的一个JAR文件尝试在加载时执行自我完整性检查,如果失败则会进入不可操作状态。很难找出为什么会发生这种情况,但是大多数消息来源指出它无法通过BD-J结构自行查找/访问它,因此它会死亡。
这排除了在加载时使用它,而是将其加载到应用程序本身。这是一个非常大的库,所以我必须创建相当多的接口,以便我可以将一个加载的对象转换为它并可能使用它。这就是我的问题所在。
接口在正常加载时加载,然后在运行时加载库并将其转换为先前加载的接口,这是一个问题吗?我正在收到ClassCastException
我尽可能地将接口从库公共方法中删除,但是当我尝试转换为接口时,我收到了ClassCastException。注意:它都可以正常加载,我可以访问构造函数并读取方法名称。只是在施放它以使其可用时它会失败。
我的项目中的接口包与工具包的不同,这有关系吗?
我的想法已经不多了,有什么我忽略了吗?
感谢。
答案 0 :(得分:0)
我不确定我是否完全了解你的问题是什么 - 也许更多关于类层次结构的详细信息将有助于弄清楚情况。从你写的内容我可以猜出两种可能的情况:
0.1。您要使用的类不实现任何接口。
在这种情况下,无论您为接口命名什么,它都不起作用,因为您加载的类不实现它们。如果您无法将该jar作为引导类路径的一部分加载,那么您将无法使用反射。
0.2。您想要的类实现一些您尝试复制的接口。
在这种情况下,接口实现必须与类正在实现的接口的确切限定名称匹配。通常,从jar加载类时,类加载器将首先从系统类加载器中获取接口,从而加载接口,一切都应该有效。
但是,如果他们使用一些疯狂的内部类加载器,他们可能仍会尝试加载自己的接口。您可以尝试通过使用“-XX:+ TraceClassLoading”来判断是否是这种情况,尽管我不知道1.3 jre是否会理解该选项。
现在,如果你愿意尝试更多,你也可以尝试另一种方法。编写自己的类加载器,加载该jar中的类和要运行的代码。这样,您的代码就可以直接引用该jar中的类,但是要启动应用程序,“main”方法必须是初始化此类加载器,使用反射加载“真实”主类并执行的方法。它的main()方法也可以通过反射。
答案 1 :(得分:0)
很可能这些类是由不同的类加载器加载的。 http://mindprod.com/jgloss/classloader.html可以提供一些想法。