Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?

为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?

作者头像
訾博ZiBo
发布于 2025-01-06 12:25:44
发布于 2025-01-06 12:25:44
1100
举报

为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件?

Java 开发中,ClassLoader 类是一个关键的组件,用于加载类和资源。其中,getResource(String name) 方法允许我们在类路径中查找指定名称的资源文件。一个常见的疑问是:为什么这个方法能够轻松地读取到Maven项目中src/main/resources目录下的文件呢?

1、类路径和资源文件

在Maven项目中,源代码通常存放在src/main/java目录下,而资源文件则存放在src/main/resources目录下。这样的组织结构是为了在构建过程中能够清晰地分离代码和资源。

在编译时,Maven将src/main/resources目录下的文件复制到类路径中,通常是target/classes目录。这意味着编译后,资源文件就变成了类路径的一部分。

2、ClassLoader 的层次结构

ClassLoader 类的设计支持层次结构,其中每个类加载器都有一个父类加载器。当类加载器需要加载类或资源时,它首先会尝试从父加载器中查找,然后再从自身的类路径中查找。

这机制为ClassLoader提供了一种委托机制,确保资源的查找是层次化的,逐级向上寻找,直至找到为止。

3、getResource 方法的工作原理

ClassLoadergetResource(String name) 方法实际上是利用了这一层次结构的委托机制。它首先尝试调用父加载器getResource 方法,如果父加载器找不到资源,再从自己的类路径中查找。这保证了在整个类加载器层次结构中,资源文件可以被有效地定位。

因此,当我们使用ClassLoadergetResource 方法时,它会顺着类加载器的层次结构,最终在编译后的类路径中找到src/main/resources目录下的文件。

4、使用 ClassLoader 类图示

image-20231121222446332
image-20231121222446332

5、仅使用 FileInputStream (不推荐,也不合理)

该路径是相对路径,并且是相对于项目的根目录的。 这么写是不合理的!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
项目打包成 jar 后包无法读取src/main/resources下文件
该代码功能是利用 common.io 包下的FileUtils来读取文件, 放到一个字符串中
时间静止不是简史
2022/05/06
13.9K0
项目打包成 jar 后包无法读取src/main/resources下文件
getClass()和getClassLoader()区别 以及ClassLoader详解及用途(文件加载,类加载)
获得ClassLoader的几种方法可以通过如下3种方法得到ClassLoader this.getClass().getClassLoader(); // 使用当前类的ClassLoader Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。(注意,system ClassLoader与根ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader)
全栈程序员站长
2022/08/18
4.9K0
踩坑集锦之你真的明白Java类路径的含义吗?
在Dubbo源码篇02—从泛化调用探究Wrapper机制的原理一文中,我们写过compileJava2Class这个方法,来编译,加载,实例化我们的代理对象的java文件:
大忽悠爱学习
2023/05/23
1.4K0
踩坑集锦之你真的明白Java类路径的含义吗?
一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别
另外,在使用springboot进行开发时,其目录默认不是WEB-INF而是BOOT-INF,但是其含义是一样的。具体如下图所示:
全栈程序员站长
2022/07/01
1.6K0
一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别
ClassLoader解析(一):Java中的ClassLoader
Step1::自定义类加载器首先从缓存中查找Class是否已经加载,如果已将加载就返回该Class;如果没加载,则委托给父加载器也就是App ClassLoader。
用户1205080
2019/01/23
6110
Android插件化开发核心类ClassLoader相关详解
最近在研究插件化开发,顺便就了解了 ClassLoader 这个类加载器,顺藤摸瓜,查到了jvm里面的双亲委派模型,这里就简单的讲一下什么是预定义类加载器和双亲委派模型?
AWeiLoveAndroid
2018/09/03
5980
Android插件化开发核心类ClassLoader相关详解
ClassLoader解惑
一个Java程序要想运行起来,首先需要经过编译生成 .class文件,然后创建一个运行环境(jvm)来加载字节码文件到内存运行,而.class 文件是怎样被加载中jvm 中的就是Java Classloader所做的事情。
加多
2018/09/06
1.4K0
ClassLoader解惑
【读码JDK】-java.lang.ClassLoader类Api介绍及测试
【读码JDK】java.lang包目录 几种类加载器 Bootstrap ClassLoader 负责加载JDK自带的rt.jar包中的类文件,它是所有类加载器的父加载器,Bootstrap ClassLoader没有任何父类加载器。 Extension ClassLoader(Platform ClassLoader)负责加载Java的扩展类库,也就是从jre/lib/ext目录下或者java.ext.dirs系统属性指定的目录下加载类。 System ClassLoader(App Clas
阿提说说
2022/12/02
3050
Java 9 揭秘
在JDK 9之前,JDK版本控制方案对开发人员来说并不直观,程序解析并不容易。 看看这两个JDK版本,你不能说出他们之间的微妙差异。 很难回答一个简单的问题:哪个版本包含最新的安全修复程序,JDK 7 Update 55或JDK 7 Update 60? 答案不是很明显的,你可能已经猜到了JDK 7 Update 60。这两个版本都包含相同的安全修复程序。 JDK 8 Update 66,1.8.0_66和JDK 8u66版本有什么区别? 它们代表相同的版本。 在了解版本字符串中包含的详细信息之前,有必要详细了解版本控制方案。 JDK 9试图规范JDK版本控制方案,因此人们很容易理解,易于程序解析,并遵循行业标准版本控制方案。
张哥编程
2024/12/19
1200
Java 9 揭秘
双亲委派模型以及SpringFactoriesLoader详解(最全最简单的介绍)
前面我们介绍了JavaConfig和常用的Annotation,这一篇文章我们来聊聊 SpringFactoriesLoader,在讲 SpringFactoriesLoader之前我会先说到JVM的类加载器以及双亲委派模型。闲话少叙,直入主题。
码农飞哥
2021/08/18
7080
编译正常运行,打jar包运行报错(找不到文件路径)
Maven项目下,从resouces目录下把文件读入内存时,例如将sql文件用文件输入流读入时,编译时运行正常,但打成jar包后运行jar包报错:
VIBE
2022/11/18
3.4K0
编译正常运行,打jar包运行报错(找不到文件路径)
Android解析ClassLoader(一)Java中的ClassLoader
前言 热修复和插件化是目前比较热门的技术,要想更好的掌握它们需要了解ClassLoader,因此也就有了本系列的产生,这一篇我们先来学习Java中的ClassLoader。 1.ClassLoader的类型 在Java虚拟机(一)结构原理与运行时数据区域这篇文章中,我提到过类加载子系统,它的主要作用就是通过多种类加载器(ClassLoader)来查找和加载Class文件到 Java 虚拟机中。 Java中的类加载器主要有两种类型,系统类加载和自定义类加载器。其中系统类加载器包括3种,分别是Bootstra
用户1269200
2018/02/01
1.3K0
Android解析ClassLoader(一)Java中的ClassLoader
ClassLoader的原理及应用
我们都知道Java是跨平台的,是因为不同平台下的JVM能将字节码文件解释为本地机器指令,JVM是怎么加载字节码文件的?答案就是ClassLoader,先来打印看一下ClassLoader对象
Java识堂
2019/08/13
5140
深入分析Java ClassLoader原理
大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常。而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。
哲洛不闹
2018/09/19
7440
深入分析Java ClassLoader原理
阅读 Flink 源码前必知必会 - SPI 和 ClassLoader
Java 中的类加载器,是 Java 运行时环境的一部分,负责动态加载 Java 类到 Java 虚拟机的内存中。
kk大数据
2021/02/07
1.4K1
阅读 Flink 源码前必知必会 - SPI 和 ClassLoader
Mybatis【2.1】-- 从读取流到创建SqlSession发生了什么?
我们使用sqlSession之前,需要去获取配置文件,获取InputStream输入流,通过SqlSessionFactoryBuilder获取sqlSessionFactory对象,从而获取sqlSession。
秦怀杂货店
2022/02/15
2910
Mybatis【2.1】-- 从读取流到创建SqlSession源码分析
我们使用sqlSession之前,需要去获取配置文件,获取InputStream输入流,通过SqlSessionFactoryBuilder获取sqlSessionFactory对象,从而获取sqlSession。
秦怀杂货店
2020/11/22
6880
【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
韩曙亮
2023/03/29
9880
【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )
ClassLoader 源码详解
ClassLoader是一个类加载器对象,负责去加载类。ClassLoader是一个抽象对象。给定了一个类的“二进制名称”,一个类加载器需要尝试去定位或者生成一个数据,该数据构成了一个定义的类。一个典型的策略就是转换名字(即,二进制名字)成一个文件名,然后从文件系统读取这个文件名包含的“字节码文件”。 注意,这里有两种方式来通过一个“二进制名称”来加载一个类: ① 定位 也就是说,表示这个类的数据已经存在了,类加载器去定位到这个存储的数据进行加载即可。比如,java.lang.String就是在rt.jar中存储的了,可以直接定位到。 ② 生成 一些在java代码中动态生成的类,而这些类的数据就是在运行期时由类加载器去生成的。比如,动态代理。
tomas家的小拨浪鼓
2019/08/07
7920
JAVA之ClassLoader
JAVA基础系列之ClassLoader 一,Java类的加载、链接与初始化 1,加载:查找并加载类的二进制数据 • 通过一个类的全限定名来获取定义此类的二进制字节流 • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 • 在内存中生成一个代表这个类的java.lang.Class类对象,作为方法区这个类的各种数据的访问入口。 2,链接 验证: 确保被加载类的正确性 准备: 为类的静态变量分配内存,并将其初始化为默认值 解析: 把类中的符号引用转化为直接引用 3,初始化 为类的静态变量赋予正确
Spark学习技巧
2018/01/31
6390
JAVA之ClassLoader
推荐阅读
相关推荐
项目打包成 jar 后包无法读取src/main/resources下文件
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档