以下场景:
- CustomClassLoaderA 加载 ClassA
- CustomClassLoaderB 加载 ClassB
到目前为止一切顺利,但是:
- CustomClassLoaderA 应该能够访问 ClassB
- CustomClassLoaderB 应该能够访问 ClassA
有谁知道我如何在 Java 中完成这个场景?另一个限制是两个 CustomClassLoader 处于同一级别。说,他们有相同的父类加载器。
非常感谢你们,伙计们!
以下场景:
到目前为止一切顺利,但是:
有谁知道我如何在 Java 中完成这个场景?另一个限制是两个 CustomClassLoader 处于同一级别。说,他们有相同的父类加载器。
非常感谢你们,伙计们!
我认为这是不可能的,因为任何普通的类加载器实现都遵循父优先策略,而且他们几乎从不寻找兄弟姐妹来加载类。我认为单独的类加载器通常用于分隔不同模块/应用程序的运行时间,这样它们就不会在命名空间中发生冲突。我不想设计破坏这个基本思想的自定义类加载器。
也就是说,我认为有一种绝妙的方法可以使用接口和工厂模式来实现这一点。让我们说,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
with的对象CustomerClassLoaderA
。
请注意,类不能在不兼容的类加载器之间共享,但对象实例可以。因此,一旦创建了对象,只要有一个公共接口(或 LHS)可以将其类型转换为,就可以在不同的类加载器中折腾它。
您还可以使用抽象类而不是接口。