欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 简单的class.getResource与classLoader.getResource区别

简单的class.getResource与classLoader.getResource区别

2024/10/24 1:57:04 来源:https://blog.csdn.net/qq_19342829/article/details/141167295  浏览:    关键词:简单的class.getResource与classLoader.getResource区别

简单的getClass().getResource()与ClassLoader.getResource()区别

1.简介

我们在springboot项目中,如果要获取到自己配置的资源或者配置类信息一般会用到Class.getResource()或ClassLoader.getResource(),这两种方式在使用的过程中很容易混淆,此处进行简单测试记录一下使用过程中的区别

本次测试项目结构图如下:
在这里插入图片描述

2.测试代码

package cn.git.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @description: class.getResource与classLoader.getResource获取资源路径信息测试*  @program: bank-credit-sy* @author: lixuchun* @create: 2024-08-13*/
@RestController
@RequestMapping("/resource")
public class ResourceTestController {/*** 通过class获取资源路径信息* getResource("") 获取的是当前类所在包的路径,而 getResource("/") 获取的是 classpath 根路径*/@GetMapping("/class")public void test() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/System.out.println(this.getClass().getResource(""));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/System.out.println(this.getClass().getResource("/"));}/*** 获取文件信息* 需要注意的是 => .java编译后编程.class,所以这里参数传的文件名是.class结尾* 当以 "/" 开头时,是从 classpath 路径开始匹配资源* 当不以 "/" 开头时,是从当前类所在包的路径开始匹配资源* 两种方式都可以通过 "/" 或 "../" 在文件夹上下层路径切换** 另外,在获取文件时,我们还可以通过 getResourceAsStream 直接获取文件输入流* InputStream inputStream = this.getClass().getResourceAsStream("/config.properties");* 且 getResourceAsStream() 和 getResource() 在获取文件流和文件路径时,路径选择机制是一样的。*/@GetMapping("/properties")public void properties() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.ymlSystem.out.println(this.getClass().getResource("/application.yml"));// nullSystem.out.println(this.getClass().getResource("custom.dict"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dictSystem.out.println(this.getClass().getResource("/dict/custom.dict"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/ResourceTestController.classSystem.out.println(this.getClass().getResource("ResourceTestController.class"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/helloApplication.classSystem.out.println(this.getClass().getResource("../helloApplication.class"));// nullSystem.out.println(this.getClass().getResource("../classpath/helloApplication.class"));}/*** 在使用 ClassLoader().getResource 获取路径时,不能以 "/" 开头,且路径总是从 classpath 根路径开始*/@GetMapping("/classLoader")public void classLoader() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/System.out.println(this.getClass().getClassLoader().getResource(""));// nullSystem.out.println(this.getClass().getClassLoader().getResource("/"));}/*** ClassLoader().getResource 只能从 classpath 开始获取资源,同样也能使用getResourceAsStream()获取文件输入流,且路径机制一样* 同Class.getResourceAsStream()一样,我们还可以通过ClassLoader.getResourceAsStream()直接获取文件输入流* ClassLoader.getResourceAsStream() 和 ClassLoader.getResource()在获取文件流和文件路径时,路径选择机制也是一样的*/@GetMapping("/classLoader/properties")public void classLoaderProperties() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.ymlSystem.out.println(this.getClass().getClassLoader().getResource("application.yml"));// nullSystem.out.println(this.getClass().getClassLoader().getResource("custom.dict"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dictSystem.out.println(this.getClass().getClassLoader().getResource("dict/custom.dict"));}}

3.结论

  • Class.getResource() 可以从当前 Class 所在包的路径开始匹配获取资源,也可以从 classpath 根路径开始匹配获取资源
  • ClassLoader().getResource() 只能从 classpath 根路径开始匹配获取资源
  • Class.getResource() 从当前包所在路径获取资源时不能以 / 开头,而从 classpath 根路径获取资源时必须以 / 开头
  • ClassLoader().getResource() 不能以 / 开头,且路径总是从 classpath 根路径开始
  • 它们都能通过 getResourceAsStream() 方法获取对应路径文件的输入流,文件路径匹配机制和其 getResource() 方法一样

本文转载此篇知乎文章,进行部分简单修改方便自己记录以及后续学习使用

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com