日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析

發布時間:2024/4/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
this.class.getClassLoader()解析

java是面向對象語言,面向對象的語言的宗旨就是萬事萬物皆對象,那么類、類里面的屬性和方法都是對象。java里面的所有的類都是Class類的對象,this.class是獲得這個類相對于Class類的對象。

getClassLoader()是獲得這個類對象的加載器。只有Class類才有getClassLoader()方法;java設計Class這個類,用于虛擬機對類的管理。當一個類被虛擬機裝載完畢的時候,就會創建一個Class類的實例,對于類A就是A.class,對于類B就是B.class。 Class類也提供了許多方法來獲取類的信息。要知道,類的裝載器分為 "啟動類裝載器 "、"用戶定義裝載器 "。它不止一種,Class類需要保存這些信息,getClassLoader()是用來獲取這個信息的;

我們來看下面這個例子:
URL fileURL = CollectionUtil.class.getClassLoader().getResource(fileName);

這個類和這個方法沒有直接的關系,只是當后面的fileName是一個相對路徑的時候,就會在這個CollectionUtil類的當前位置開始查找資源文件;如果是個絕對路徑的話,那前面的類是任意的Java類都可以了,因為.class.getClassLoader()是為了獲得一個類加載器,用來加載classpath下的.class文件而已。getResource返回的是一個URL對象,不要簡單的認為是這個資源的絕對地址,這是一個Java中封裝的對象。

另外,提醒一下,很少是單獨用上面這個URL對象的,一般是通過這個URL對象來構造Java中的FIle對象以及Icon對象等等,參考代碼如下:

File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile()); String icon = "../image/1.gif "; button.setIcon(new ImageIcon(getClass() .getResource(icon)));
Class.getResource和ClassLoader.getResource解析

Java中取資源時,經常用到Class.getResource和ClassLoader.getResource,這里來看看他們在取資源文件時候的路徑問題。

Class.getResource()

Class.getResouece(String path);

path不以“/”開頭時,默認是從此類所在的包下取資源;path以“/”開頭時,則是從ClassPath根下獲取;

觀察如下示例:

文件結構如下:



如果我們想在Test.java中分別取1~3.xml文件,該怎么實現?

package testpackage;public class TestMain {public static void main(String[] args) {// 當前類(class)所在的包目錄System.out.println(TestMain.class.getResource(""));// class path根目錄System.out.println(TestMain.class.getResource("/"));// TestMain.class在<bin>/testpackage包中// 1.properties 在bin目錄(class根目錄)System.out.println(TestMain.class.getResource("/1.properties"));// TestMain.class在<bin>/testpackage包中// 2.properties 在<bin>/testpackage包中System.out.println(TestMain.class.getResource("2.properties"));// TestMain.class在<bin>/testpackage包中// 3.properties 在<bin>/testpackage.subpackage包中System.out.println(TestMain.class.getResource("subpackage/3.properties"));} } Class.getResource()和Class.getResourceAsStream()使用時,在路徑選擇上是一樣的。


Class.getClassLoader().getResource(String path)

path不能以“/”開頭時,是從ClassPath根下獲取;

package testpackage; public class TestMain {public static void main(String[] args) {TestMain t = new TestMain();System.out.println(t.getClass());System.out.println(t.getClass().getClassLoader());System.out.println(t.getClass().getClassLoader().getResource(""));System.out.println(t.getClass().getClassLoader().getResource("/"));//null} }
運行結果: class testpackage.TestMain sun.misc.Launcher$AppClassLoader@1fb8ee3 file:/E:/workspace/Test/bin/ null
還是上面的文件結構,使用Class.getClassLoader().getResourse(String path)該怎么實現呢?

package testpackage;public class Test {public static void main(String[] args) {TestMain t = new TestMain();System.out.println(t.getClass().getClassLoader().getResource(""));System.out.println(t.getClass().getClassLoader().getResource("1.properties"));System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));} }
Class.getClassLoader().getResource()和Class.getClassLoader().getResourceStream()使用時,在路徑選擇上也是一樣的。

總結

以上是生活随笔為你收集整理的Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。