java - 动态 Jar 加载让我很困惑

标签 java classloader

从概念上讲,当我加载新的 Jar 时我在做什么? URLClassloader 是唯一的选择吗?我应该如何形成这些 URL 以指向包含更多 jar 的子目录。

如果有人觉得 super 慷慨,一些执行以下操作的演示代码将非常有帮助(让我们假设“jars/A.jar”包含我们要实例化的“myClass”):

  1. 从子目录加载一些 jar
  2. 从中返回特定的类
  3. 实例化该类

最佳答案

Conceptually, what am I doing when I'm loading a new Jar?

从概念上讲,您并没有加载新的 JAR。相反,您正在定义一个类加载器,它将根据需要从 JAR 文件加载代码和其他资源。

Is URLClassloader the only choice?

理论上,您可以实现自己的 ClassLoader 子类,但这对于您想要做的事情来说并不是必需的。

How should I form those URLs to point to a subdirectory containing more jars.

我认为这是你问题的核心。 URLClassLoader构造函数将 URL[] 参数解释如下:

"Any URL that ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to refer to a JAR file which will be downloaded and opened as needed."

在上面引用的文本的第一种情况下,假定目录是包含要加载的资源的树的根。

但我猜测您正在尝试设置一个类加载器,该加载器将从给定目录中的所有 JAR 文件加载。为此,您需要:

  1. 读取目录并为任何 JAR 文件构建 File 对象列表。
  2. 创建一个数组来保存相同数量的 URL 实例。
  3. 对于每个 JAR 文件 File,使用 File.toURL() 创建 URL 并添加到数组中。 (使用 File.toURL() 意味着您将获得适用于您平台的 JAR 文件的完整“file:” URL。)
  4. 使用 URL 数组创建 URLClassLoader

关于java - 动态 Jar 加载让我很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350350/

相关文章:

java - 我们如何计算正多边形内最大圆的直径?

java - 如何在运行时从 jar 加载工作目录中的 .class?

java - 如何确保类加载器可以访问临时 jar 文件

java - 从测试方法访问时单例返回新实例

java - 如何从特定的jar加载实现类

java - 类加载器如何加载 list 类路径中的类引用?

java - Eclipse 链接替代 @PreUpdate 注释?

java - 了解 E 类抛出的表达式

java - Weblogic 中用于集群计时器的单例服务

java - 在 Java 中使用 ExecutorService 和 Callable 写入文件不起作用