JDK中Class对象的getResource方法

2023-12-09 06:10

本文主要是介绍JDK中Class对象的getResource方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  class对象的getResource()方法、Classloader的静态方法getSystemResource()方法和实例方法getResource()方法都是从classpath路径中获取资源,如声音,图片等。但是它们的使用却有着细微的差别。

 

  首先从它们的源码入手,下面是它们的源码: 

 

    public java.net.URL getResource(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A system class.return ClassLoader.getSystemResource(name);}return cl.getResource(name);}
    public URL getResource(String name) {URL url;if (parent != null) {url = parent.getResource(name);} else {url = getBootstrapResource(name);}if (url == null) {url = findResource(name);}return url;}
    public static URL getSystemResource(String name) {ClassLoader system = getSystemClassLoader();if (system == null) {return getBootstrapResource(name);}return system.getResource(name);}
   从源代码中我们可以看出,Class对象的getResource()方法和ClassLoader.getSystemResource()方法都是先去获取classloader(对于获取到的classloader为 NULL时,就会按照双亲委托模型让自己的父类加载器去查找),然后调用ClassLoader对象的getResource()方法去完成资源的查找。
但是两者使用起来毕竟是有区别的,区别就在于Class对象的getResource()方法中的 resolveName(name);对参数name的处理。
    private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class<?> c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}
   看了resolveName(String)的源码,我们就能理解在JDK API中对此方法的解释了。

  

JDK API 1.6 Class类 写道
public URL getResource(String name)查找带有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)。
在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:

如果 name 以 '/' ('\u002f') 开始,则绝对资源名是 '/' 后面的 name 的一部分。
否则,绝对名具有以下形式: modified_package_name/name
其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。

参数:
name - 所需资源的名称
返回:一个 URL 对象;如果找不到带有该名称的资源,则返回 null
从以下版本开始: JDK1.1

 

   下面给出示例代码,这个示例要比对着类的组织结构来看:

  

  

Class<Test> c = Test.class;
URL url = c.getResource("test.txt");
System.out.println(url);
url = c.getResource("/my/slf4j/test/test.txt");
System.out.println(url);
url = c.getResource("/my/slf4j/test-2.txt");
System.out.println(url);System.out.println("===============");ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
url = classLoader.getResource("my/slf4j/test-2.txt");
System.out.println(url);
url = classLoader.getResource("my/slf4j/test/test.txt");
System.out.println(url);System.out.println("===============");url = ClassLoader.getSystemResource("my/slf4j/test-2.txt");
System.out.println(url);
url = ClassLoader.getSystemResource("my/slf4j/test/test.txt");
System.out.println(url);

  

file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test-2.txt
===============
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test-2.txt
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt
===============
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test-2.txt
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt

    说明:在开头我们讲了是通过classpath路径去获取资源文件,因此我们的资源文件(test.txt/test-2.txt)都是放在源文件这个目录下的,编译后他们会到xxx/bin/下的某个目录。即资源文件的路径是在classpath路径下。

 

这篇关于JDK中Class对象的getResource方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/472751

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很