zoukankan      html  css  js  c++  java
  • Class.getResource与ClassLoader.getResource()区别

    class.getResource(String res)的使用

      该方法是根据类的相对路径来访问资源的。如果该类没有package,则类的根路径是就是当前路径;如果该类有package,则类的根路径是定级包所在的路径。例如:

    Drawing没有定义package,Drawing.class与images在相同路径下这样访问:当前路径就是根路径

    Image img = (new ImageIcon(Drawing.class.getResource("images/title.gif"))).getImage();

    Image img = (new ImageIcon(Drawing.class.getResource("./images/title.gif"))).getImage();

    Image img = (new ImageIcon(Drawing.class.getResource("/images/title.gif"))).getImage();

    Drawing定义package myjava.gui,Drawing.class位于myjava/gui目录,myjava与images在相同路径下这样访问:

    Image img = (new ImageIcon(Drawing.class.getResource("/images/title.gif"))).getImage();(实际中建议使用该方式)

    Image img = (new ImageIcon(Drawing.class.getResource("http://images.cnblogs.com/title.gif"))).getImage();

    ===================================

    Class.getResource()方法实际上委托装入该类的类装载器,返回一个用于读取类文件资源的URL;或者,当指定的类名字不能在当前的classpath中找到时,Class.getResource()方法返回null。

    ===================================

    可以看到,Class的getResource方法,实际上是靠调入这个类的ClassLoader的getResource方法来实现的,如果调入这个类的ClassLoader是原生的BootStrap ClassLoader,这个ClassLoader是用C++写成的,在Java中没有相对应的物件。这时候的实现靠的是ClassLoader的静态方法getSystemResource。

    只有当使用Class类的getResource方法的时候,才会有下面介绍的那种算法。

    这种算法就是说,如果你指定的路径以/开头,那么就是从ClassPath的起点开始寻找这个路径。如果直接以某个名字开头,那么就是从当前包名的目录为起点开始寻找。所以大家如果用过hibernate就知道,有些表示类到数据库表的映射关系的xml文件就和这个类的class文件放在一起,这样它就直接使用这个类.class.getResource方法来得到这个xml文件。

    而在使用ClassLoader的getResource方法的时候,永远是以Classpath为直接起点开始寻找资源的。不用担心从什么包开始寻找的问题。

    用Class.getResource不加/就是从当前包开始找,用ClassLoader.getResource不加/就是直接从Classpath的起点开始寻找。

    当然,如果你觉得有困难,你定位资源的时候全部都使用/开头的方式就好了。

    三条简洁说明:

    1 class.getResource("/")是从classpath开始寻找资源文件

    2 class.getResource("")是从当前包开始寻找资源文件

    3 classLoader.getResource("")是从classpath开始寻找资源文件
  • 相关阅读:
    idHTTP使用代理IP
    Delphi的TRegistry注册表类方法详解
    判断WebBrowser是否加载完成.
    vs2010 安装记
    Delphi中destroy, free, freeAndNil, release用法和区别
    IdHTTP处理HTTP 302遇到的问题
    passcal 多线程例子,线程管理,创建,暂停,中止,等待等。。。
    passcal try嵌套
    passcal 编写多线程程序
    用一个 Byte 数表示 8 个复选框的选择状态
  • 原文地址:https://www.cnblogs.com/happyPawpaw/p/3010017.html
Copyright © 2011-2022 走看看