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

news2024/11/15 19:28:02

简单的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.yml
        System.out.println(this.getClass().getResource("/application.yml"));
        
        // null
        System.out.println(this.getClass().getResource("custom.dict"));
        
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict
        System.out.println(this.getClass().getResource("/dict/custom.dict"));

        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/ResourceTestController.class
        System.out.println(this.getClass().getResource("ResourceTestController.class"));

        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/helloApplication.class
        System.out.println(this.getClass().getResource("../helloApplication.class"));

        // null
        System.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(""));
        
        // null
        System.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.yml
        System.out.println(this.getClass().getClassLoader().getResource("application.yml"));
        
        // null
        System.out.println(this.getClass().getClassLoader().getResource("custom.dict"));
        
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict
        System.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() 方法一样

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts格式化图例回调函数返回对象

使用返回的对象可以自定义图例显示 formatter:function(obj){var label obj.seriesName "<br/>" obj.marker obj.name ":" obj.value "宗" "<br/>" "占比" obj.percent "%";return label…

四川大型数字媒体产业园区在哪里,有推荐吗?

四川省作为中国西南地区的经济和文化重镇&#xff0c;数字媒体产业的发展取得了令人瞩目的成绩。以下是四川省排名前十的数字媒体产业园&#xff0c;这些园区在推动科技创新和区域经济发展方面发挥了重要作用。 1、 国际数字影像产业园 位置&#xff1a;成都市金牛区 特点&…

触摸屏接口设置-洋桃百科

触摸屏接口设置-洋桃百科 电路设计 ​​ 触摸屏的组成&#xff1a; PCB板层&#xff1a;是电子设备中用于支撑和连接电子元件的基板。 显示层&#xff1a;是LCD触摸屏的核心部分&#xff0c;负责生成视觉图像。它由以下部分组成&#xff1a; 液晶层&#xff1a;包含液晶材料…

框架盛行,还记得原生JS如何获取表单数据吗?

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注&#xff01;个人知乎 在这个前端框架遍地开花的时代&#xff0c;同学们常常被React、Vue、Angular等现代JavaScript框架的便捷性和高效性所吸引。那么多年过去&#xff0c;你还记得原生JS是如何获取表单数据的吗…

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理

本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理&#xff0c;同时总结一些代表性工作。 注&#xff1a;图像代表Image&#xff0c;视频代表Video&#xff08;不含声音&#xff09;&#xff0c;音频代表 Audio/Music&#xff0c;语音代表Speech 各种…

docker数据卷和资源控制

目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制&#xff08;比重&#xff09; 2. 设置cpu的资源占用比&#xff08;权重&#xff09; 3.设置容器绑定cpu 内存 1.内存限制 …

Docker搭建Minio容器

Docker搭建Minio容器 前言 在上一集我们介绍了分布式文件存储行业解决方案以及技术选型。最终我们决定选用Minio作为分布式文件存储。 那么这集我们就在Docker上搭建Minio容器即可。 Docker搭建Minio容器步骤 创建Minio文件目录 我们选择创建/minio/data目录 修改目录权…

系统编程 day11 进程(线程)3

fork函数的总结&#xff1a; 总结对进程学习之中的回收函数wait wait函数&#xff1a; 1.获取子进程的退出状态 2.回收资源------会让僵尸态的子进程销毁 注&#xff1a;1.wait函数本身是一个阻塞操作&#xff0c;会使调用者阻塞 2.父进程要获得子进程的退出状态 子进程&…

解决STM32G474单片机_HAL_UART_Transmit_IT()连续发送之问题

在使用STM32G474单片机的HAL库时&#xff0c;使用“在中断服务程序中发送数据”和“在中断程序中接收数据”&#xff0c;是一种很常用的方法&#xff0c;特别是RS485通讯中。首次使用&#xff0c;肯定会踩坑。要么出现第一个数据收不到&#xff0c;要么出现连续发送&#xff0c…

米联客-FPGA程序设计Verilog语法入门篇连载-02 Verilog语法_基本设计方法

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本节主要讲解Verilog的基本设…

【屏驱MCU】增加自定义分区指南

说明&#xff1a;本文主要给出基于该款 点屏 MCU。增加自定义分区指南 屏驱MCU系列文章 【屏显MCU】多媒体接口总结&#xff08;一&#xff09; 【DVP接口】0v5640的DVP接口设计分析&#xff08;硬件&#xff09; 【DVP接口】0v5640的DVP接口设计分析&#xff08;软件&#xff…

CCF-GESP8级考试—图论算法及综合应用(最小生成树)

&#x1f349;1 最小生成树的概念 1.1 连通图 &#x1f388; 连通图用于描述图中顶点之间是否存在路径相连。一个无向图中&#xff0c;如果从图中的任意一个顶点出发&#xff0c;都可以通过边的连接到达图中的任意其他顶点&#xff0c;则该图被称为连通图。 连通图的性质&…

为何众多卖家都选择入驻亚马逊VC?有什么优势?——WAYLI威利跨境助力商家

众多卖家选择入驻亚马逊VC&#xff08;Vendor Central&#xff09;&#xff0c;主要是因为VC平台为卖家提供了一系列显著的优势。VC使卖家与亚马逊建立直接供应关系&#xff0c;提升曝光率和销售机会。作为全球领先电商平台&#xff0c;亚马逊拥有庞大用户群和完善物流体系&…

C#窗体自定义快捷操作键的实现 - 开源研究系列文章

这次想到应用程序的窗体的快捷操作键的使用的问题。 上次发布过一个快捷键的例子(https://www.cnblogs.com/lzhdim/p/18342051)&#xff0c;区别在于它是操作系统全局注册的热键&#xff0c;如果其它应用程序注册了对应的热键&#xff0c;那就会失效。此例子是对某个窗体里的按…

AI驱动人才社区革新:智能化探索与实践

一、引言&#xff1a;AI赋能人才新生态 在21世纪的数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理能力、学习优化算法及创新应用模式&#xff0c;正深刻地改变着各行各业的面貌&#xff0c;人才管理领域亦不例外。传统的人才社区&#xf…

yolo中的iou是什么意思

在YOLO&#xff08;You Only Look Once&#xff09;算法中&#xff0c;IoU 是“Intersection over Union”的缩写&#xff0c;中文可以理解为“交并比”。IoU 是一个用于衡量两个边界框&#xff08;bounding box&#xff09;重叠程度的指标。具体来说&#xff0c;IoU 是通过计算…

CUDA-MODE 第二课: PMPP 书的第1-3章

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode 第二课: PMPP 书的第1-3章 这节课非常基础&#xff0c;讲的都是基本概念和初级的注意事项&#xff0c;有CUDA基础的朋友可以不用花时间看。 PMPP …

C#语言基础速成Day06

“心之官则思&#xff0c;思则得之&#xff0c;不思则不得也。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day06 一、C#属性访问器、方法参数属性访问器&#xff08;Property Accessors&#xff09;方法参数&#xff08;Method Parameters&#xff09;综合示例 二、C…

小红书种草推广丨爆品层出不穷,品牌还能怎么「造新」?

当品牌已经被大众熟知&#xff0c;要如何在茫茫消费市场中脱颖而出&#xff0c;再度吸引用户的目光&#xff1f; 当品牌陷入增长困境&#xff0c;要如何再造爆品&#xff0c;打造增长的第二曲线&#xff0c;延长品牌的生命周期&#xff1f; …… 就这个大家关心的这些问题&…

三菱定位控制(一)

下面小编开始开始总结学习定位控制&#xff0c;以Q系列三菱PLC来展开学习&#xff0c;希望对读者或者小白有所帮助&#xff01;&#xff01;&#xff01; 一 三菱PLC定位模块 为什么需要学习定位模块&#xff08;三菱FXCPU能实现一个伺服电机的控制&#xff0c;多个要买定位模…