以下情景:
到目前为止一切顺利,但是:
有没有人知道如何在Java中完成这个场景?另一个限制是两个CustomClassLoader在同一级别上。比如说,他们拥有相同的父级ClassLoader。
非常感谢你们,伙计们!
答案 0 :(得分:4)
我不认为这是可能的,因为任何普通的类加载器实现都遵循父优先策略,并且他们几乎从不期望兄弟姐妹加载类。我认为单独的类加载器通常用于分隔不同模块/应用程序的运行时间,以便它们不会在命名空间中发生冲突。我不想设计破坏这个基本想法的自定义类加载器。
那就是说,我认为使用接口和工厂模式可以实现这一目标。我们说ClassA
实现了InterfaceA
,并且有一个名为AFactory
的工厂可以创建/吐出InterfaceA
的对象。
我们必须确保父类加载器加载类InterfaceA
和AFactory
。
然后CustomClassLoaderA
,使用ClassA
(可能在启动时)注册AFactory
的对象:
AFactory aFactory = AFactory.getInstance():
aFactory.registerA(new ClassA());
然后,执行CustomClassLoaderB
的代码通过以下代码获取ClassA
的实例:
AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();
可以编写类似的代码,以便与ClassB
共享CustomerClassLoaderA
的对象。
请注意,不能在不兼容的类加载器之间共享类,但是对象实例可以。因此,一旦创建了对象,只要有一个公共接口(或LHS)来键入它就可以在不同的类加载器周围抛出它。
您也可以使用抽象类而不是接口。