当前位置: 首页 > news >正文

简单的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() 方法一样

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Golang】go mod的使用
  • 性能测试 —— linux服务器搭建JMeter+Grafana+Influxdb监控可视化平台!
  • Spring Boot集成钉钉群通知机器人
  • Vue2 和 Vue3 自定义指令比较
  • 昂科烧录器支持PAI-IC澎湃微电子的32位微控制器PT32L031K6T6
  • 多模态论文自己学习路程_每天推出新版本_请看当天版本
  • 【vue3|第23期】Vite + Vue3: 深入理解public和assets文件夹的作用与使用
  • 安装postgresql和PGVector
  • Linux线程基础学习记录(线程的创建、回收以及结束)
  • C#中的S7协议
  • 【计算机网络】应用层自定义协议与序列化
  • 批量查询全国快递单号:高效追踪物流信息
  • HarmonyOS应用开发学习-ArkUI-容器组件
  • springboot的学习(二):常用配置
  • 【算法 04】汉诺塔递归求解和通式求解
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【面试系列】之二:关于js原型
  • eclipse的离线汉化
  • JAVA_NIO系列——Channel和Buffer详解
  • k8s 面向应用开发者的基础命令
  • Redis字符串类型内部编码剖析
  • VUE es6技巧写法(持续更新中~~~)
  • vue脚手架vue-cli
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 机器学习 vs. 深度学习
  • 原生js练习题---第五课
  • 正则表达式小结
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ionic入门之数据绑定显示-1
  • MPAndroidChart 教程:Y轴 YAxis
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​数据链路层——流量控制可靠传输机制 ​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #QT(QCharts绘制曲线)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (23)Linux的软硬连接
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (七)Knockout 创建自定义绑定
  • (自用)网络编程
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core 中的路径问题
  • .net wcf memory gates checking failed
  • .net快速开发框架源码分享
  • /etc/sudoers (root权限管理)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法