2011-05-09 54 views
5

我让用户使用URLClassLoader从远程位置导入类似插件的类,因此这些导入的类不存在于构建路径中(但是,它们全部实现了包含在内的接口IPlugin)。等同于ObjectOutputStream,不仅保存其状态,还保存整个对象?

我假设可以简单地使用ObjectOutputStream将所有加载的插件保存到文件中,然后使用ObjectInputStream读取这些插件。这似乎并不是这种情况,因为它保存的只是对象的状态,而不是包含的逻辑(即方法)。

什么我希望做是为了节省加载的插件(activePlugins)与ObjectOutputStream的名单:

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*); 
oos.writeObject(activePlugins); 
oos.close(); 
在另一个运行时

然后,负载/恢复所有的这些插件与ObjectInputStream的:

ObjectInputStream ois = new ObjectInputStream(*fileinputstream*); 
activePlugins = (ArrayList<IPlugin>) ois.readObject(); 

但是由于实际的对象类在构建路径中不可用(它们位于硬盘上的其他位置),因此它会出现故障。我所追求的是某种加载对象的方式,而不需要可用的类,即加载具有状态和没有依赖关系的对象。

+0

您还必须序列化流中的类字节。您可以通过'getResourceAsStream'获取类字节,然后在另一端使用这些字节在自定义类加载器中加载类,然后将结果类转换为接口,并通过接口使用该对象。 – MeBigFatGuy 2011-05-09 17:20:28

回答

4

你需要你自己的类加载器。你基本上想要类似于URLClassLoader的东西,但能够在本地下载和缓存jar。你可能想看看扩展URLClassLoader或者实现类似的东西。你基本上只需要钩入jar下载的部分,并将其粘贴到本地的某个地方(或者如果你之前已经下载过,则从该缓存的位置加载它)。

+2

我一直在看这个问题几分钟。起初他无法理解这个问题,因为他谈论的是状态和方法。我认为这听起来像他实际上都想有一个自定义类加载器(NetworkClassLoader)和ObjectOutputStream。听起来他想要保存插件的状态,而不仅仅是插件。或者我现在完全离开地图? – Kaj 2011-05-09 17:06:36

+0

好点,我错过了他实际上_did_想要保存的对象状态。更新了我的答案。 – jtahlborn 2011-05-09 17:20:42

1

看看RMI。这通过类传递机制扩展了序列化,所以你可以序列化和反序列化(在接收者)未知类的对象,并执行它们的方法。

这是使用一些远程类加载机制,我认为。

+1

仅仅为了加载类而使用RMI听起来不对。据我所知,他不想执行远程方法。 – Kaj 2011-05-09 17:14:47

+0

RMI使用Java Serialization的注释工具链接到代码的URL(尽管它可以关闭)。 – 2011-05-09 19:54:30

0

Altought Java不是我的主要编程框架,我在其他“框架”(如PHP,Delphi和C#)中看到过相同的问题。

一种解决方案是声明类文件&路径。

另一个建议是,既然你指定了,你不关心逻辑,只关心(“数据”)状态,你可以声明一个存储属性值的泛型类。