zoukankan      html  css  js  c++  java
  • Class.getResource()和ClassLoader.getResource()异同及用法

    this.class.getClassLoader()解析

    java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类、类里面的属性和方法都是对象。java里面的所有的类都是Class类的对象,this.class是获得这个类相对于Class类的对象。

    getClassLoader()是获得这个类对象的加载器。只有Class类才有getClassLoader()方法;java设计Class这个类,用于虚拟机对类的管理。当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class,对于类B就是B.class。 Class类也提供了许多方法来获取类的信息。要知道,类的装载器分为 "启动类装载器 "、"用户定义装载器 "。它不止一种,Class类需要保存这些信息,getClassLoader()是用来获取这个信息的;

    我们来看下面这个例子:

    1. URL fileURL = CollectionUtil.class.getClassLoader().getResource(fileName);  

    这个类和这个方法没有直接的关系,只是当后面的fileName是一个相对路径的时候,就会在这个CollectionUtil类的当前位置开始查找资源文件;如果是个绝对路径的话,那前面的类是任意的Java类都可以了,因为.class.getClassLoader()是为了获得一个类加载器,用来加载classpath下的.class文件而已。getResource返回的是一个URL对象,不要简单的认为是这个资源的绝对地址,这是一个Java中封装的对象。

    另外,提醒一下,很少是单独用上面这个URL对象的,一般是通过这个URL对象来构造Java中的FIle对象以及Icon对象等等,参考代码如下:


    1. File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());  
    2. String   icon   =   "../image/1.gif ";   
    3. button.setIcon(new   ImageIcon(getClass() .getResource(icon)));  


    Class.getResource和ClassLoader.getResource解析

    Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。

    Class.getResource()

     
    1. Class.getResouece(String path);  

      path不以“/”开头时,默认是从此类所在的包下取资源;path以“/”开头时,则是从ClassPath根下获取;

    文件结构如下:

    如果我们想在Test.java中分别取1~3.xml文件,该怎么实现?

     
    1. package testpackage;  
    2.   
    3. public class TestMain {  
    4.   
    5.     public static void main(String[] args) {  
    6.         // 当前类(class)所在的包目录  
    7.         System.out.println(TestMain.class.getResource(""));  
    8.         // class path根目录  
    9.         System.out.println(TestMain.class.getResource("/"));  
    10.   
    11.     // TestMain.class在<bin>/testpackage包中  
    12.         // 1.properties  在bin目录(class根目录)  
    13.         System.out.println(TestMain.class.getResource("/1.properties"));  
    14.           
    15.         // TestMain.class在<bin>/testpackage包中  
    16.         // 2.properties  在<bin>/testpackage包中  
    17.         System.out.println(TestMain.class.getResource("2.properties"));  
    18.           
    19.         // TestMain.class在<bin>/testpackage包中  
    20.         // 3.properties  在<bin>/testpackage.subpackage包中  
    21.         System.out.println(TestMain.class.getResource("subpackage/3.properties"));  
    22.           
    23.     }  
    24. }  

    Class.getResource()和Class.getResourceAsStream()使用时,在路径选择上是一样的。

     

    Class.getClassLoader().getResource(String path)

    当前getClassLoader().getResource(String path) ,path不能以“/”开头时,是从ClassPath根下获取;

    1. package testpackage;  
    2. public class TestMain {  
    3.     public static void main(String[] args) {  
    4.         TestMain t = new TestMain();  
    5.         System.out.println(t.getClass());  
    6.         System.out.println(t.getClass().getClassLoader());  
    7.         System.out.println(t.getClass().getClassLoader().getResource(""));  
    8.         System.out.println(t.getClass().getClassLoader().getResource("/"));//获取值为null  
    9.     }  
    10. }  


    运行结果:

    1. class testpackage.TestMain  
    2. sun.misc.Launcher$AppClassLoader@1fb8ee3  
    3. file:/E:/workspace/Test/bin/  
    4. null  


    还是上面的文件结构,使用Class.getClassLoader().getResourse(String path)该怎么实现呢?

     
    1. package testpackage;  
    2.   
    3. public class Test {  
    4.     public static void main(String[] args) {  
    5.         TestMain t = new TestMain();  
    6.         System.out.println(t.getClass().getClassLoader().getResource(""));  
    7.           
    8.         System.out.println(t.getClass().getClassLoader().getResource("1.properties"));  
    9.         System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));  
    10.         System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));  
    11.     }  
    12. }  


    Class.getClassLoader().getResource()和Class.getClassLoader().getResourceStream()使用时,在路径选择上也是一样的。

  • 相关阅读:
    数据结构 图的接口定义与实现分析(超详细注解)
    数据结构-优先队列 接口定义与实现分析
    什么是梯度?
    javascript当中火狐的firebug如何单步调试程序?
    给出一个javascript的Helloworld例子
    lvs dr 模型配置详解
    数据库连接池
    JDBC事务管理
    JDBC工具类:JDBCUtils
    详解JDBC对象
  • 原文地址:https://www.cnblogs.com/jet-angle/p/8342919.html
Copyright © 2011-2022 走看看