Java 类加载器:两个类加载器及其类之间的访问级别

Java 类加载器:两个类加载器及其类之间的访问级别,java,classloader,Java,Classloader,以下场景: CustomClassLoaderA加载ClassA CustomClassLoaderB加载ClassB 到目前为止还不错,但是: CustomClassLoaderA应该能够访问ClassB CustomClassLoaderB应该能够访问ClassA 有人知道我如何用Java实现这个场景吗?另一个限制是两个CustomClassLoader位于同一级别。比如说,它们有相同的父类加载器 非常感谢你们,伙计们 我认为这是不可能的,因为任何普通的类加载器实现都遵循父优先策略,

以下场景:

  • CustomClassLoaderA加载ClassA
  • CustomClassLoaderB加载ClassB
到目前为止还不错,但是:

  • CustomClassLoaderA应该能够访问ClassB
  • CustomClassLoaderB应该能够访问ClassA
有人知道我如何用Java实现这个场景吗?另一个限制是两个CustomClassLoader位于同一级别。比如说,它们有相同的父类加载器


非常感谢你们,伙计们

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

也就是说,我认为使用接口和工厂模式有一种很好的方法来实现这一点。比如说,
ClassA
实现了
InterfaceA
,有一个名为
AFactory
的工厂,它创建/输出
InterfaceA
的对象

我们必须确保类
InterfaceA
AFactory
都是由父类加载器加载的

然后
CustomClassLoaderA
,向
a工厂注册
ClassA
的对象(可能在启动时):

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

AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();
可以编写类似的代码,用于与
CustomerClassLoaderA
共享
ClassB
的对象

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


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

我认为这是不可能的,因为任何正常的类装入器实现都遵循父级优先策略,而且它们几乎从不考虑同级装入类。我认为单独的类加载器通常用于分离不同模块/应用程序的运行时,这样它们就不会在名称空间中发生冲突。我不想设计破坏这一基本思想的自定义类装入器

也就是说,我认为使用接口和工厂模式有一种很好的方法来实现这一点。比如说,
ClassA
实现了
InterfaceA
,有一个名为
AFactory
的工厂,它创建/输出
InterfaceA
的对象

我们必须确保类
InterfaceA
AFactory
都是由父类加载器加载的

然后
CustomClassLoaderA
,向
a工厂注册
ClassA
的对象(可能在启动时):

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

AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();
可以编写类似的代码,用于与
CustomerClassLoaderA
共享
ClassB
的对象

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


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

看起来您只需要一个类加载器。看起来您只需要一个类加载器。谢谢。。你说服我用另一种策略来完成这个场景!谢谢你说服我用另一种策略来完成这个场景!