1. 程式人生 > >Class.getResource()和ClassLoader.getResource()異同及用法

Class.getResource()和ClassLoader.getResource()異同及用法

iss term 分享圖片 launch 以及 app 當前位置 取值 sun

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. public class TestMain {
  3. public static void main(String[] args) {
  4. // 當前類(class)所在的包目錄
  5. System.out.println(TestMain.class.getResource(""));
  6. // class path根目錄
  7. System.out.println(TestMain.class.getResource("/"));
  8. // TestMain.class在<bin>/testpackage包中
  9. // 1.properties 在bin目錄(class根目錄)
  10. System.out.println(TestMain.class.getResource("/1.properties"));
  11. // TestMain.class在<bin>/testpackage包中
  12. // 2.properties 在<bin>/testpackage包中
  13. System.out.println(TestMain.class.getResource("2.properties"));
  14. // TestMain.class在<bin>/testpackage包中
  15. // 3.properties 在<bin>/testpackage.subpackage包中
  16. System.out.println(TestMain.class.getResource("subpackage/3.properties"));
  17. }
  18. }

Class.getResource()和Class.getResourceAsStream()使用時,在路徑選擇上是一樣的。

Class.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. public class Test {
  3. public static void main(String[] args) {
  4. TestMain t = new TestMain();
  5. System.out.println(t.getClass().getClassLoader().getResource(""));
  6. System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
  7. System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
  8. System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
  9. }
  10. }


Class.getClassLoader().getResource()和Class.getClassLoader().getResourceStream()使用時,在路徑選擇上也是一樣的。

Class.getResource()和ClassLoader.getResource()異同及用法