如何在 windows 上从 JAR 反映 类

How to reflect classes from JAR on windows

假设下面的loader定义(这个例子是用scala写的,但是和Java几乎一样,所以你应该很容易理解问题):

jar = new File("path/to/myjar.jar")
url = jar.toURI.toURL
urls = Array[URL](url)  // just a single-element array containing the url
loader = new URLClassLoader(urls)

JAR myjar.jar 包含 org/pack/Simple.classSimple 有标准包 org.pack 并通过 JavaCompiler 编译并打包到 JAR 中。 JAR 是正确的(可执行等)

在 linux 上,loader.loadClass("org.pack.Simple") returns 正确的 Class 对象。

在 windows 上,它抛出一个 ClassNotFoundException。当然,我使用\而不是/作为文件分隔符。

我做错了什么?或者只是 windows 很烂?我安装了 OracleJDK8 并将其 bin/ 文件夹添加到 path.

编辑 1:

如果我将 JAR 解压到某个目录并让 ClassLoader 从指向该目录的 URL 读取,一切正常。这怎么可能?

昨天我为这个问题苦苦挣扎了很久,但经过长时间的谷歌搜索后,我偶然发现了解决方案。

您指定的 URL 对象必须按如下方式创建:

URLClassLoader.addURL(new File(pathParam).toURI().toURL());

或者在构造函数中如下:

new URLClassLoader(new URL[]{new File(pathParam).toURI().toURL()},this.getClass().getClassLoader());

注意构造函数有父class-loader作为参数。

用于 loadClass() 方法。您需要确保 class 的路径是二进制格式(正如您已经在做的那样)。

出于某种原因,即使我使用 URL(String) 构造函数创建了一个 URL 对象,它也不会起作用。

如果你去看看 java.lang.ClassLoader super-class,你会注意到它默认抛出一个异常。这就是 classloader 很重要的原因。

protected Class<?> findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    }