Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析
java是面向?qū)ο笳Z言,面向?qū)ο蟮恼Z言的宗旨就是萬事萬物皆對(duì)象,那么類、類里面的屬性和方法都是對(duì)象。java里面的所有的類都是Class類的對(duì)象,this.class是獲得這個(gè)類相對(duì)于Class類的對(duì)象。
getClassLoader()是獲得這個(gè)類對(duì)象的加載器。只有Class類才有g(shù)etClassLoader()方法;java設(shè)計(jì)Class這個(gè)類,用于虛擬機(jī)對(duì)類的管理。當(dāng)一個(gè)類被虛擬機(jī)裝載完畢的時(shí)候,就會(huì)創(chuàng)建一個(gè)Class類的實(shí)例,對(duì)于類A就是A.class,對(duì)于類B就是B.class。 Class類也提供了許多方法來獲取類的信息。要知道,類的裝載器分為 "啟動(dòng)類裝載器 "、"用戶定義裝載器 "。它不止一種,Class類需要保存這些信息,getClassLoader()是用來獲取這個(gè)信息的;
我們來看下面這個(gè)例子:URL fileURL = CollectionUtil.class.getClassLoader().getResource(fileName);
這個(gè)類和這個(gè)方法沒有直接的關(guān)系,只是當(dāng)后面的fileName是一個(gè)相對(duì)路徑的時(shí)候,就會(huì)在這個(gè)CollectionUtil類的當(dāng)前位置開始查找資源文件;如果是個(gè)絕對(duì)路徑的話,那前面的類是任意的Java類都可以了,因?yàn)?strong>.class.getClassLoader()是為了獲得一個(gè)類加載器,用來加載classpath下的.class文件而已。getResource返回的是一個(gè)URL對(duì)象,不要簡(jiǎn)單的認(rèn)為是這個(gè)資源的絕對(duì)地址,這是一個(gè)Java中封裝的對(duì)象。
另外,提醒一下,很少是單獨(dú)用上面這個(gè)URL對(duì)象的,一般是通過這個(gè)URL對(duì)象來構(gòu)造Java中的FIle對(duì)象以及Icon對(duì)象等等,參考代碼如下:
Class.getResource和ClassLoader.getResource解析
Java中取資源時(shí),經(jīng)常用到Class.getResource和ClassLoader.getResource,這里來看看他們?cè)谌≠Y源文件時(shí)候的路徑問題。
Class.getResource()
path不以“/”開頭時(shí),默認(rèn)是從此類所在的包下取資源;path以“/”開頭時(shí),則是從ClassPath根下獲取;
觀察如下示例:
文件結(jié)構(gòu)如下:
如果我們想在Test.java中分別取1~3.xml文件,該怎么實(shí)現(xiàn)?
package testpackage;public class TestMain {public static void main(String[] args) {// 當(dāng)前類(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()使用時(shí),在路徑選擇上是一樣的。
Class.getClassLoader().getResource(String path)
path不能以“/”開頭時(shí),是從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} }運(yùn)行結(jié)果: class testpackage.TestMain sun.misc.Launcher$AppClassLoader@1fb8ee3 file:/E:/workspace/Test/bin/ null
還是上面的文件結(jié)構(gòu),使用Class.getClassLoader().getResourse(String path)該怎么實(shí)現(xiàn)呢? 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()使用時(shí),在路徑選擇上也是一樣的。
總結(jié)
以上是生活随笔為你收集整理的Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (二)html5中的属性
- 下一篇: 大话设计模式—单例模式