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開始尋找資源文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM