ClassLoader:两个ClassLoader及其类之间的访问级别

时间:2013-07-30 14:10:02

标签: java classloader

以下情景:

  • CustomClassLoaderA加载ClassA
  • CustomClassLoaderB加载ClassB

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

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

有没有人知道如何在Java中完成这个场景?另一个限制是两个CustomClassLoader在同一级别上。比如说,他们拥有相同的父级ClassLoader。

非常感谢你们,伙计们!

1 个答案:

答案 0 :(得分:4)

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

那就是说,我认为使用接口和工厂模式可以实现这一目标。我们说ClassA实现了InterfaceA,并且有一个名为AFactory的工厂可以创建/吐出InterfaceA的对象。

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

然后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)来键入它就可以在不同的类加载器周围抛出它。

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