gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:45:23 26 4
gpt4 key购买 nike

以下场景:

  • CustomClassLoaderA 加载 ClassA
  • CustomClassLoaderB 加载 ClassB

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

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

有谁知道如何用 Java 实现这个场景?还有一个限制是两个 CustomClassLoader 位于同一级别。比如说,它们有相同的父类加载器。

提前非常感谢你们,伙计们!

最佳答案

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

也就是说,我认为有一种使用接口(interface)和工厂模式来实现这一点的绝妙方法。假设,ClassA 实现了 InterfaceA,并且有一个名为 AFactory 的工厂,它创建/吐出 InterfaceA 的对象.

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

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

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

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

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

可以编写类似的代码来与 CustomerClassLoaderA 共享 ClassB 的对象。

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

您还可以使用抽象类代替接口(interface)。

关于java - ClassLoader:两个ClassLoader及其类之间的访问级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17949394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com