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");
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。