JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别

 更新时间:2021年07月29日 09:09:20   作者:心笑峰  
这篇文章主要介绍了JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致。

例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.class.getResourceAsStream("name") 会在com.test.mycode包下查找相应的资源。

如果这个name是以 '/' 开头的,那么就会从classpath的根路径下开始查找。

ClassLoader.getResourceAsStream() 无论要查找的资源前面是否带'/' 都会从classpath的根路径下查找。

所以: MyTest.getClassLoader().getResourceAsStream("name") 和

MyTest.getClassLoader().getResourceAsStream("name") 的效果是一样的。

顺便提下JAVA中类的加载器:

一共有三种加载器

bootstrap classloader :负责加载JAVA核心类( jre 下lib和class目录中的内容)
extension classloader :负责加载JAVA扩展类(jre 下lib/ext 目录中的内容)
system classloader :负责加载应用指定的类 (环境变量classpath中配置的内容)

一个类的加载顺序也是按上面的排列来的,这样就能保证系统的类能先加载。

与此同时用户也可以自己定义ClassLoader,用来加载特殊的资源。

这里就涉及到 Class.getClassLoader() 和 Thread.currentThread.getContextClassLoader()的区别。

举一个简单的例子:

假如某天JAVA给我们提供了一个叫 StartCamera 的类用来启动电脑的标准摄像头,并将这个类打包在一个jar中。

正常情况下,我们要启动摄像头时只需将这个jar配置到classpath中。系统启动时system classloader会将这个类加载到应用中。

但因为摄像头的生产厂家不一样,针对新的设备会有多个不同的StartCamera实现,在应用中我们不知道实际的用户会用到哪种。于是我们就自定义了一个ClassLoader,用来针对具体的设备类型加载相应的StartCamera类。

这样一来就出现:优先加载我们定义的类,加载不到的情况下再加载系统的。 这样的需求,是系统默认的父委托加载机制无法满足的。

Thread.currentThread.getContextClassLoader() 就是这样产生的。 我们使用Thread.currentThread.setContextClassLoader() 可以为当前线程指定相应的ClassLoader,然后用get的方式来获取。

那么上面的加载代码就可能是这样子的:

publicvoiduseCamera(){
StartCameras=this.findClassLoader().loadClass("StartCamera");

s.start();
}


privateClassLoaderfindClassLoader(){
ClassLoaderloader=Thread.currentThread().getContextClassLoader();
if(loader==null){
loader=ClassLoader.getSystemClassLoader();
}

returnloader;
}

到此这篇关于JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别的文章就介绍到这了,更多相关java ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现的统计字符算法示例

    java实现的统计字符算法示例

    这篇文章主要介绍了java实现的统计字符算法,涉及java针对字符的遍历、判断、运算等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • 在SpringBoot项目中实现读写分离的流程步骤

    在SpringBoot项目中实现读写分离的流程步骤

    SpringBoot作为一种快速开发框架,广泛应用于Java项目中,在一些大型应用中,数据库的读写分离是提升性能和扩展性的一种重要手段,本文将介绍如何在SpringBoot项目中优雅地实现读写分离,并通过适当的代码插入,详细展开实现步骤,同时进行拓展和分析
    2023-11-11
  • 解决springcloud集成nacos遇到的问题

    解决springcloud集成nacos遇到的问题

    这篇文章介绍了如何解决springcloud集成nacos遇到的问题,文章中有详细的代码示例,需要的朋友可以参考一下
    2023-04-04
  • Java获取XML节点总结之读取XML文档节点的方法

    Java获取XML节点总结之读取XML文档节点的方法

    下面小编就为大家带来一篇Java获取XML节点总结之读取XML文档节点的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Spring Security组件一键接入验证码登录和小程序登录的详细过程

    Spring Security组件一键接入验证码登录和小程序登录的详细过程

    这篇文章主要介绍了Spring Security 一键接入验证码登录和小程序登录,简单介绍一下这个插件包的相关知识,本文结合示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-04-04
  • Java之PreparedStatement的使用详解

    Java之PreparedStatement的使用详解

    这篇文章主要介绍了Java之PreparedStatement的使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SchedulingConfigurer实现动态定时,导致ApplicationRunner无效解决

    SchedulingConfigurer实现动态定时,导致ApplicationRunner无效解决

    这篇文章主要介绍了SchedulingConfigurer实现动态定时,导致ApplicationRunner无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • JavaWeb中Servlet的深入讲解

    JavaWeb中Servlet的深入讲解

    这篇文章主要介绍了JavaWeb中Servlet的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java实现消息队列的两种方式(小结)

    java实现消息队列的两种方式(小结)

    本文主要介绍了两种java实现消息队列的方式,利用Spring消息模板发送消息和Apache ActiveMQ官方实例发送消息,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • elasticsearch索引创建create index集群matedata更新

    elasticsearch索引创建create index集群matedata更新

    这篇文章主要介绍了elasticsearch索引创建create index及集群matedata更新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04

最新评论