我让用户使用URLClassLoader从远程位置导入类似插件的类,因此构建路径中不存在这些导入的类(但是,它们都实现了接口 IPlugin ,这是包括在内)。
我假设可以简单地使用ObjectOutputStream将所有加载的插件保存到文件中,然后使用ObjectInputStream读取它们。但这似乎并非如此,因为它所保存的只是对象的状态,而不是包含逻辑(即方法)。
我希望用ObjectOutputStream保存加载的插件列表(activePlugins):
ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*);
oos.writeObject(activePlugins);
oos.close();
然后在另一个运行时,使用ObjectInputStream加载/恢复所有这些插件:
ObjectInputStream ois = new ObjectInputStream(*fileinputstream*);
activePlugins = (ArrayList<IPlugin>) ois.readObject();
但是由于实际对象类在构建路径中不可用(它们位于硬盘驱动器上的其他位置),因此它会变得混乱。我所追求的是在没有可用类的情况下加载对象的某种方式,即加载具有状态且没有依赖关系的对象。
答案 0 :(得分:4)
你需要自己的类加载器。你基本上想要类似于URLClassLoader的东西,但能够在本地下载和缓存jar。您可能希望查看扩展URLClassLoader或实现类似的东西。你基本上需要只是挂钩到下载jar的部分并将其粘贴在本地某处(或者如果你之前已经下载了它,则从该缓存位置加载它)。
答案 1 :(得分:1)
看看RMI。这扩展了使用类传输机制的序列化,因此您可以很好地序列化和反序列化(在接收器处)未知类的对象,并执行它们的方法。
我认为这是使用一些远程类加载机制完成的。
答案 2 :(得分:0)
Altought Java不是我的主要编程框架,我在PHP,Delphi和C#等其他“框架”中也遇到了同样的问题。
一种解决方案是声明类文件&amp;路径。
另一个建议是,既然你预先指定了,你不关心逻辑,只关心(“数据”)状态,你可以声明一个存储属性值的泛型类。