0

以下场景:

  • CustomClassLoaderA 加载 ClassA
  • CustomClassLoaderB 加载 ClassB

到目前为止一切顺利,但是:

  • CustomClassLoaderA 应该能够访问 ClassB
  • CustomClassLoaderB 应该能够访问 ClassA

有谁知道我如何在 Java 中完成这个场景?另一个限制是两个 CustomClassLoader 处于同一级别。说,他们有相同的父类加载器。

非常感谢你们,伙计们!

4

1 回答 1

4

我认为这是不可能的,因为任何普通的类加载器实现都遵循父优先策略,而且他们几乎从不寻找兄弟姐妹来加载类。我认为单独的类加载器通常用于分隔不同模块/应用程序的运行时间,这样它们就不会在命名空间中发生冲突。我不想设计破坏这个基本思想的自定义类加载器。

也就是说,我认为有一种绝妙的方法可以使用接口和工厂模式来实现这一点。让我们说,ClassA实现InterfaceA并且有一个名为的工厂AFactory,它创建/吐出InterfaceA.

我们必须确保类InterfaceAAFactory都由父类加载器加载。

然后CustomClassLoaderA,注册一个对象ClassAAFactory可能在启动时):

AFactory aFactory = AFactory.getInstance():
aFactory.registerA(new ClassA());

然后执行的代码通过以下代码CustomClassLoaderB获取 的实例ClassA

AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();

可以编写类似的代码来共享ClassBwith的对象CustomerClassLoaderA

请注意,类不能在不兼容的类加载器之间共享,但对象实例可以。因此,一旦创建了对象,只要有一个公共接口(或 LHS)可以将其类型转换为,就可以在不同的类加载器中折腾它。

您还可以使用抽象类而不是接口。

于 2013-07-30T14:25:48.723 回答