Java中如何使用ClassLoader加载各种资源(类、文件、web资源)呢?

戚薇 Java经验 发布时间:2023-06-27 10:43:56 阅读数:17705 1
下文笔者讲述使用ClassLoader加载资源文件的方法分享,如下所示

ClassLoader的功能

ClassLoader的功能:
   主要对类的请求提供服务
    当JVM需要某类时
    它根据名称向ClassLoader要求这个类
    然后由ClassLoader返回这个类的class对象

ClassLoader:
    负责载入系统的所有资源(Class,文件,图片,来自网络的字节流等)
使用ClassLoader将资源载入JVM中
    每个class都有一个引用
     指向自己ClassLoader

获得ClassLoader的几种方法

使用如下3种方法即可得到ClassLoader
  方式1: 
    this.getClass.getClassLoader();//使用当前类ClassLoader 
  方式2:
    Thread.currentThread().getContextClassLoader();//使用当前线程ClassLoader 
  方式3:
    ClassLoader.getSystemClassLoader();//使用系统ClassLoader,即系统的入口点所使用的ClassLoader
注意事项:
    system ClassLoader与根ClassLoader并不一样
    JVM下system ClassLoader通常为App ClassLoader

用ClassLoader载入资源的几种方法

类的载入方式

有类A和类B
  A在其方法里需要实例化B
 载入类的方法有以下3种:

1.使用Class静态方法 Class.forName  
Class cls = Class.forName("com.java265.B");  
 B b = (B)cls.newInstance(); 

2.使用ClassLoader 
/* Step 1. Get ClassLoader */
 ClassLoader cl = this.getClass.getClassLoader();;  // 如何获得ClassLoader参考1

 /* Step 2. Load the class */
 Class cls = cl.loadClass("com.java265.B"); // 使用第一步得到的ClassLoader来载入B
    
 /* Step 3. new instance */
 B b = (B)cls.newInstance(); // 有B的类得到一个B的实例

3. 直接new  
  B b = new B();

文件的载入方式(如:配置文件等)

在com.java265.A类中读取文件夹 
  /com/java265/config 的文件sys.properties
读取文件可使用绝对路径或相对路径
  绝对路径相对简单

在Windows中以盘号开始
  在Unix下以"/"开始
 对于相对路径
   其相对值是相对于ClassLoader
     因为ClassLoader是一棵树
文件读取方式,如下所示

1.直接用IO流读取

/**
 * 假设当前位置是 "C:/test",通过执行如下命令来运行A "java com.aleixa.A"
 * 1. 在程序里可以使用绝对路径,Windows下的绝对路径以盘号开始,Unix下以"/"开始
 * 2. 也可以使用相对路径,相对路径前面没有"/"
 * 因为我们在 "C:/test" 目录下执行程序,程序入口点是"C:/test",相对路径就
 * 是 "com/java265/config/sys.properties"
 * (例子中,当前程序的ClassLoader是App ClassLoader,system ClassLoader = 当前的
 * 程序的ClassLoader,入口点是"C:/test")
 * 对于ClassLoader树,如果文件在jdk lib下,或在jdk lib/ext下,或在环境变量里,
 * 都可以通过相对路径"sys.properties"找到,lib下的文件最先被找到
 */
File f = new File("C:/test/com/aleixa/config/sys.properties"); // 使用绝对路径
//File f = new File("com/java265/config/sys.properties"); // 使用相对路径
InputStream is = new FileInputStream(f);  

2.使用ClassLoader

/**
 * 因为有3种方法得到ClassLoader
 * 对应有如下3种ClassLoader方法读取文件
 * 使用的路径是相对于这个ClassLoader的那个点的相对路径,此处只能使用相对路径
 */
InputStream is = null;
is = this.getClass().getClassLoader().getResourceAsStream(
       "com/java265/config/sys.properties"); //方法1
//is = Thread.currentThread().getContextClassLoader().getResourceAsStream(
       "com/java265/config/sys.properties"); //方法2
//is = ClassLoader.getSystemResourceAsStream("com/java265/config/sys.properties"); //方法3 

3.使用ResourceBundle

ResourceBundle bundle = ResourceBundle.getBoundle("com.java265.config.sys"); 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202306/16878338836911.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者