Java中如何使用ClassLoader加载各种资源(类、文件、web资源)呢?
下文笔者讲述使用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");
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


