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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

classloader.getresources() 介绍

發(fā)布時間:2023/11/29 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 classloader.getresources() 介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自: https://www.cnblogs.com/bhlsheji/p/4095699.html

◆普通情況下,我們都使用相對路徑來獲取資源,這種靈活性比較大.

比方當(dāng)前類為com/bbebfe/Test.class

而圖像資源比方sample.gif應(yīng)該放置在com/bbebfe/sample.gif

而假設(shè)這些圖像資源放置在icons文件夾下,則應(yīng)該是com/bbebfe/icons/sample.gif

通過當(dāng)前類文件的路徑獲取資源主要有例如以下幾種方式:

· 如果當(dāng)前類為com.bbebfe.Test

· 包所在的目錄為bin

String imageName?= "icons/sample.gif"

1,?通過Class.getResource()定位類路徑下的資源(bin/com/bbebfe/icons/sample.gif)

Class clazz = this.getClass();

URL url =?clazz.getResource(imageName);

2,通過ClassLoader.getResource()定位包的根文件夾下的資源(bin/icons/sample.gif)

Class clazz = this.getClass();

URLClassLoader loader = (URLClassLoader)clazz.getClassLoader();

URL url = loader.getResource(imageName);

3,?通過ClassLoader.findResource()提供自己定制的方式定位資源

URL url = loader.findResource(imageName);

?

◆那么這三種方法有那些差別,?我們應(yīng)該在何時使用哪種方法呢?

·?Class.getResource()?方法

該方法實際通過該Class的Class Loader的getResource()方法來獲得資源,?在調(diào)用ClassLoader的getResource()方法之前, Class.getResource()方法會對資源名稱做一定的處理,構(gòu)建一個該資源的絕對名稱(absolute name,?大意是:

???????+假設(shè)資源名稱以'/'('"u002f')?開始,?則資源的絕對名稱是'/'以后的部分.

??????????????假設(shè)imageName是"/icons/sample.gif",?則在這里會變成"icons/sample.gif"

???????+否則對于其它情況,?絕對名稱將是例如以下形式(給資源名稱的前面加上modified_package_name/):
????????????? modified_package_name/resource_name (修正的包名稱/資源名稱)

當(dāng)中修正的包名稱含義是將當(dāng)前對象所在的包名稱中的'.'('"u002e')替換為'/'

假設(shè)ClassLoader.getResource()方法返回一個值為null的URL,?則Class.getResource()方法終于會將資源請求交給ClassLoader.getSystemResource(java.lang.String).

·?ClassLoader.getResource()?方法

該對資源進(jìn)行查找,?資源的名稱是以'/'分隔的路徑,?這種方法首先查找自己的父親ClassLoader,由自己的父ClassLoader來查找資源(實際上,?假設(shè)父親的父親不是空,?則父親仍會向上提交查找請求).?假設(shè)自己的父ClassLoader是null,?則查找Java虛擬機(jī)中內(nèi)建的class loader,?并將資源請求提交給它們,?假設(shè)這些操作都失敗了,?則ClassLoader會調(diào)用自己的findResource()方法來查找資源.

·?ClassLoader.findResource()?方法

該方法在內(nèi)部查找指定的資源,?假設(shè)你實現(xiàn)了自己的Class Loader,則應(yīng)該重載這種方法以自己特定的方式來查找類文件和資源.

?

◆通過以上的總結(jié),?我們能夠看到三點(diǎn).

1,?不管是getResource(),?還是findResource(),?這些方法都僅僅是資源的定位方法,?終于都僅僅是返回一個URL,?僅僅是對資源的定位而已,?我們隨后應(yīng)通過自己的方法來讀取這些資源.?而在Class和ClassLoader中還定義的有g(shù)etResourceAsStream方法,?該方法是getResource的增強(qiáng)版,?這里就不介紹了.

2,假設(shè)須要以類為相對路徑查找資源,?則應(yīng)該調(diào)用Class.getResource()方法,?不要直接調(diào)用ClassLoader.getResource()方法.?另外,?除非是你自定義了ClassLoader并重載了findResource方法,否則也不要直接調(diào)用ClassLoader.findResource方法,?由于在Class.getResource()方法中會對資源名稱作一定的處理,?這在上面介紹了,?以下舉個實例:

???????如果我的當(dāng)前類在EclipseprojectDatabase下,?類所在的包是com.bbebfe.test,?而icons文件夾放在bin/com/bbebfe/test/文件夾下,?我須要得到icons/sample.gif文件的URL,?則調(diào)用this.getClass().getResource()得到的URL是:

??????file:/E:/MyLife/MyProjects/Eclipse3.2/Database/bin/com/bbebfe/test/icons/disremove.gif

?

3,?有時候我們希望某個jar庫的圖像資源在同一個icons下統(tǒng)一管理,?而不是為每一個包以下的Class建一個icons,?也就是說須要以庫為相對路徑來查找資源,?此時則應(yīng)該調(diào)用ClassLoader.getResource()方法,?舉個樣例:

·某個project有例如以下的包結(jié)構(gòu):

?????? com.bbebfe.ui

?????? com.bbebfe.test

?????? com.bbebfe.database

·假設(shè)以類為相對路徑,?則在每一個包下都必須建立一個icons文件夾,?并放置對應(yīng)的資源文件.?例如以下:

?????? com.bbebfe.ui/icons/...

?????? com.bbebfe.test/icons/...

?????? com.bbebfe.database/icons/...

·而我們可能希望在根文件夾下放置一個icons文件夾,?把全部資源放置在這里管理,?這樣還能夠防止資源的反復(fù).?就是例如以下形式

?????? com.bbebfe.ui

?????? com.bbebfe.test

?????? com.bbebfe.database

???????icons/sample.gif ...

???????則此時我們應(yīng)該調(diào)用ClassLoader.getResource方法,?因為它沒有對資源名稱作處理,?也就是說沒有將修正的包名加入到資源名稱前,?所以它會在類所在的包的根下去查找資源.(執(zhí)行java程序的語法是java com.bbebfe.ui.Test,?所以根文件夾是com文件夾的上級文件夾).

?

◆最后,?在Java中對資源進(jìn)行定位的方法有非常多種,?在Eclipse源碼中還有例如以下一段定位文件資源的代碼,?還沒有時間研究,?以后再談:

ProtectionDomain?domain = Main.class.getProtectionDomain();

CodeSource?source = null;

URL?result = null;

if (domain != null)

source = domain.getCodeSource();//獲得code source

if (source != null)

????? result = source.getLocation();//獲得URL

??????????

String path = decode(result.getFile());//

// normalize to not have leading / so we can check the form

File file = new File(path);

path = file.toString().replace('""', '/');

// create a file URL (via File) to normalize the form (e.g., put

// the leading / on if necessary)

path = new File(path).toURL().getFile();

?

?

剛才試了一下,發(fā)現(xiàn)假設(shè)類路徑上有反復(fù)的資源,getResource()方法會返回類路徑上碰到的第一個資源。?

而getResources()則會返回當(dāng)前類載入器路徑上的全部反復(fù)資源以及父類載入器上的全部反復(fù)資源。?

比方,在tomcat/lib文件夾下放置一個zip文件,包括config/aaa.txt文件,?
在WEB-INF/lib文件夾下復(fù)制一份這個zip文件,?
再在src文件夾下放上config/aaa.txt文件,?

getResource("config/aaa.txt")返回結(jié)果是:?
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt?

getResources("config/aaa.txt")返回結(jié)果是:?
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt?
jar:file:/D:/apache-tomcat-6.0.16/lib/aaaaa.jar!/config/aaa.txt?
jar:file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/lib/bbbbb.jar!/config/aaa.txt?

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

總結(jié)

以上是生活随笔為你收集整理的classloader.getresources() 介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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