Java 类加载器:两个类加载器及其类之间的访问级别
以下场景:Java 类加载器:两个类加载器及其类之间的访问级别,java,classloader,Java,Classloader,以下场景: CustomClassLoaderA加载ClassA CustomClassLoaderB加载ClassB 到目前为止还不错,但是: CustomClassLoaderA应该能够访问ClassB CustomClassLoaderB应该能够访问ClassA 有人知道我如何用Java实现这个场景吗?另一个限制是两个CustomClassLoader位于同一级别。比如说,它们有相同的父类加载器 非常感谢你们,伙计们 我认为这是不可能的,因为任何普通的类加载器实现都遵循父优先策略,
- CustomClassLoaderA加载ClassA
- CustomClassLoaderB加载ClassB
- CustomClassLoaderA应该能够访问ClassB
- CustomClassLoaderB应该能够访问ClassA
非常感谢你们,伙计们 我认为这是不可能的,因为任何普通的类加载器实现都遵循父优先策略,而且它们几乎从不考虑同级加载类。我认为单独的类加载器通常用于分离不同模块/应用程序的运行时,这样它们就不会在名称空间中发生冲突。我不想设计破坏这一基本思想的自定义类装入器 也就是说,我认为使用接口和工厂模式有一种很好的方法来实现这一点。比如说,
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)将其类型转换到,就可以在不同的类装入器中使用它
您也可以使用抽象类而不是接口。看起来您只需要一个类加载器。看起来您只需要一个类加载器。谢谢。。你说服我用另一种策略来完成这个场景!谢谢你说服我用另一种策略来完成这个场景!