从概念上讲,当我加载新的 Jar 时我在做什么? URLClassloader 是唯一的选择吗?我应该如何形成这些 URL 以指向包含更多 jar 的子目录。
如果有人觉得 super 慷慨,一些执行以下操作的演示代码将非常有帮助(让我们假设“jars/A.jar”包含我们要实例化的“myClass”):
- 从子目录加载一些 jar
- 从中返回特定的类
- 实例化该类
最佳答案
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 文件加载。为此,您需要:
- 读取目录并为任何 JAR 文件构建
File
对象列表。 - 创建一个数组来保存相同数量的
URL
实例。 - 对于每个 JAR 文件
File
,使用File.toURL()
创建URL
并添加到数组中。 (使用File.toURL()
意味着您将获得适用于您平台的 JAR 文件的完整“file:” URL。) - 使用
URL
数组创建URLClassLoader
。
关于java - 动态 Jar 加载让我很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350350/