gpt4 book ai didi

java - 如何使用加载不同 Java 类加载器的实现?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:59 25 4
gpt4 key购买 nike

我正在编写一个库,允许人们使用插件框架(如果您熟悉的话,它是 JPF)来提供某些接口(interface)的实现。插件不存储在类路径中。该框架为每个插件提供了一个 ClassLoader,因此当请求接口(interface)“MyInterface”的名为“MyImpl”的实现时,我可以找到正确的插件,然后使用该插件的 ClassLoader 加载类,从中我可以创建一个实例如果我对构造函数有所了解。到目前为止一切顺利。

但是,现在我遇到一个情况,我需要调用一个仅在该特定实现上可用的方法。因此,我可以尝试两种方法:

方法一:

// Makes sure that MyImpl has been loaded, using the custom classloader
Plugins.getClass(MyInterface.class, "MyImpl");
// This line will not compile because MyImpl is not available at build time
MyImpl foo = new MyImpl();
// If I could get this far, this line would work:
foo.methodOnlyInMyImpl();

方法二:

// This call will get an instance of MyImpl (already written and tested)
MyInterface foo = Plugins.getInstance(MyInterface.class, "MyImpl");
// Compiler error because there is no MyInterface.methodOnlyInMyImpl method.
foo.methodOnlyInMyImpl()

方法 1 是两者中更简洁的一种,因为它与类是“普通”且无法通过插件访问时编写代码的方式最相似。但是,两者都无法编译。

到目前为止我想到的选项:
A. 使用方法 2,但使用反射来执行 methodOnlyInMyImpl 方法调用(请不要!)
B. 将插件类放在构建路径中,然后使用方法 1,它会编译。 (我目前最喜欢的)
C. B+ 安装插件时,将类文件复制到类路径中的另一个目录,以便系统类加载器加载它们(导致其他问题)

所以,我的问题是:

  1. 我是否遗漏了另一个更好的想法?
  2. 如果我做 B,我会在运行时遇到问题吗?毕竟,使用 MyImpl 的类大概是使用系统类加载器加载的。所以,一旦它看到 MyImpl foo,它会不会尝试使用系统类加载器加载 MyImpl,这会失败(即使 Plugins.newInstance 调用会提供 MyImpl 的实例)?

最佳答案

首先,当您需要针对实际实现进行实现时,您从插件机制中获得了什么优势?该插件应实现一个接口(interface),您可以通过该接口(interface)使用该实现。

我不熟悉 JPF,但 java 类在由不同的类加载器加载时永远不兼容。但是有两种可能的方式:

  1. 接口(interface)在您的类加载器中,插件类加载器以您的类加载器为父类,因此它的接口(interface)与您的相同。当该方法在接口(interface)中声明时,代码 2 应该与此一起使用。

  2. 您可以使用序列化。这是一种在独立类加载器之间传输数据对象更有用的有限方式。我需要使用它在两个 Web 应用程序之间使用请求参数进行跨上下文调度。

关于java - 如何使用加载不同 Java 类加载器的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1758241/

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