如何在 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.class
。 Simple
有标准包 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);
}
假设下面的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.class
。 Simple
有标准包 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);
}