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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Class.getResource和ClassLoader.getResource的区别分析

發(fā)布時間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Class.getResource和ClassLoader.getResource的区别分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:http://swiftlet.net/archives/868

?

在Java中獲取資源的時候,經(jīng)常用到Class.getResource和ClassLoader.getResource,本文給大家說一下這兩者方法在獲取資源文件的路徑差異。
Class.getResource(String path)
path不以'/'開頭時,默認(rèn)是從此類所在的包下取資源;path以'/'開頭時,則是從項目的ClassPath根下獲取資源。在這里'/'表示ClassPath
JDK設(shè)置這樣的規(guī)則,是很好理解的,path不以'/'開頭時,我們就能獲取與當(dāng)前類所在的路徑相同的資源文件,而以'/'開頭時可以獲取ClassPath根下任意路徑的資源。
如下所示的例子:

1 2 3 4 5 6 7 8 public class Test { ????public static void main(String[] args) ????{ ????????System.out.println(Test.class.getResource("")); ????????System.out.println(Test.class.getResource("/")); ????} }

運(yùn)行結(jié)果為:
file:/D:/work_space/java/bin/net/swiftlet/
file:/D:/work_space/java/bin/

Class.getClassLoader().getResource(String path)
path不能以'/'開頭時,path是指類加載器的加載范圍,在資源加載的過程中,使用的逐級向上委托的形式加載的,'/'表示Boot ClassLoader中的加載范圍,因為這個類加載器是C++實(shí)現(xiàn)的,所以加載范圍為null。如下所示:

1 2 3 4 5 6 7 8 public class Test { ????public static void main(String[] args) ????{ ????????System.out.println(Test.class.getClassLoader().getResource("")); ????????System.out.println(Test.class.getClassLoader().getResource("/")); ????} }

運(yùn)行結(jié)果為:
file:/D:/work_space/java/bin/
null
從上面可以看出:
class.getResource("/") == class.getClassLoader().getResource("")
其實(shí),Class.getResource和ClassLoader.getResource本質(zhì)上是一樣的,都是使用ClassLoader.getResource加載資源的。下面請看一下jdk的Class源碼:

1 2 3 4 5 6 7 8 9 10 11 ??public java.net.URL getResource(String name) ????{ ????????name = resolveName(name); ????????ClassLoader cl = getClassLoader0(); ????????if (cl==null) ????????{ ????????????// A system class. ????????????return ClassLoader.getSystemResource(name); ????????} ????????return cl.getResource(name); ????}

從上面就可以看才出來:Class.getResource和ClassLoader.getResource本質(zhì)上是一樣的。至于為什么Class.getResource(String path)中path可以'/'開頭,是因為在name = resolveName(name);進(jìn)行了處理:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 private String resolveName(String name) ????{ ????????if (name == null) ????????{ ????????????return name; ????????} ????????if (!name.startsWith("/")) ????????{ ????????????Class c = this; ????????????while (c.isArray()) { ????????????????c = c.getComponentType(); ????????????} ????????????String baseName = c.getName(); ????????????int index = baseName.lastIndexOf('.'); ????????????if (index != -1) ????????????{ ????????????????name = baseName.substring(0, index).replace('.', '/') ????????????????????+"/"+name; ????????????} ????????} else ????????{//如果是以"/"開頭,則去掉 ????????????name = name.substring(1); ????????} ????????return name; ????}

轉(zhuǎn)載于:https://www.cnblogs.com/Dhouse/p/5945859.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。