ClassLoader classLoader = Main.class.getClassLoader();和ClassLoader classLoader = getClass().getClassLoader();的区别
时间: 2024-03-31 11:30:26 浏览: 34
ClassLoader classLoader = Main.class.getClassLoader(); 和 ClassLoader classLoader = getClass().getClassLoader(); 的区别在于获取ClassLoader的方式不同。
1. Main.class.getClassLoader():这种方式是通过类名来获取ClassLoader。在这种情况下,Main是一个具体的类名,表示获取Main类的ClassLoader。这种方式适用于在静态方法中获取ClassLoader,或者在没有实例对象的情况下获取ClassLoader。
2. getClass().getClassLoader():这种方式是通过实例对象来获取ClassLoader。在这种情况下,getClass()返回的是当前对象的运行时类,然后通过运行时类获取ClassLoader。这种方式适用于在实例方法中获取ClassLoader,或者已经有实例对象的情况下获取ClassLoader。
总结:
- Main.class.getClassLoader() 适用于静态方法或者没有实例对象的情况下获取ClassLoader。
- getClass().getClassLoader() 适用于实例方法或者已经有实例对象的情况下获取ClassLoader。
需要注意的是,如果没有自定义的ClassLoader,那么这两种方式获取到的ClassLoader都是系统默认的ClassLoader。
相关问题
怎么通过 Enumeration<URL> resources = classLoader.getResources(path); 获取jar内的文件
通过 `classLoader.getResources(path)` 获取到的是一个URL列表,其中包含了符合指定路径的所有资源文件的URL,包括位于jar包中的资源文件的URL。我们可以通过遍历这个URL列表,获取到每个资源文件的URL,然后使用Java的JarURLConnection类来读取jar包中的资源文件。
下面是一个示例代码:
```java
ClassLoader classLoader = getClass().getClassLoader();
Enumeration<URL> resources = classLoader.getResources("com/example/config.properties");
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
if (url.getProtocol().equals("file")) {
// 处理普通文件
File file = new File(url.toURI());
// 读取文件内容
} else if (url.getProtocol().equals("jar")) {
// 处理jar包中的文件
JarURLConnection connection = (JarURLConnection) url.openConnection();
InputStream inputStream = connection.getInputStream();
// 读取文件内容
}
}
```
以上代码中,我们首先通过 `classLoader.getResources(path)` 获取到了符合指定路径的所有资源文件的URL,然后通过 `hasMoreElements()` 和 `nextElement()` 方法遍历这个URL列表,对于每个URL,判断它的协议是 `file` 还是 `jar`。如果是 `file` 协议,说明该资源文件是一个普通文件,我们可以使用 `File` 类获取到该文件的路径,然后读取文件内容即可。如果是 `jar` 协议,说明该资源文件位于jar包中,我们可以通过 `JarURLConnection` 类获取到该文件的输入流,然后读取文件内容即可。需要注意的是,读取文件时,要根据文件的类型进行不同的处理。
打成jar包后 执行Enumeration<URL> resources = classLoader.getResources(path);和正常执行不一样吗
在将应用程序打成jar包后,执行 `classLoader.getResources(path)` 方法获取jar包内的资源文件时,有一些细微的差别。
在打包前,我们可以使用普通的URLClassLoader来加载资源文件,其路径类似于 `file:/path/to/resource`。但是,在jar包中,资源文件的路径是类似于 `jar:file:/path/to/myjar.jar!/com/example/MyClass.class` 这样的形式,其中包含了jar包的路径和资源文件的路径。
因此,在打包后,我们需要使用JarURLConnection来获取资源文件的输入流,代码如下:
```java
ClassLoader classLoader = getClass().getClassLoader();
Enumeration<URL> resources = classLoader.getResources("com/example/config.properties");
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
JarURLConnection connection = (JarURLConnection) url.openConnection();
try (InputStream inputStream = connection.getInputStream()) {
// 处理资源文件
}
}
```
在打包后,我们不能再使用普通的URLClassLoader来加载资源文件,而是需要通过JarURLConnection来获取资源文件的输入流。另外,需要注意的是,在使用完资源文件的输入流后,需要手动关闭它,否则会导致资源泄漏。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![java](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)