3 回答

TA貢獻1797條經(jīng)驗 獲得超6個贊
根據(jù)您的需求制定解決方案......
有兩件事情,getResource
/ getResourceAsStream()
從它被稱為的類得到...
類加載器
起始位置
所以,如果你這樣做
this.getClass().getResource("foo.txt");
它將嘗試從與“this”類相同的包中加載foo.txt,并使用“this”類的類加載器。如果你在前面放了一個“/”,那么你絕對是引用資源的。
this.getClass().getResource("/x/y/z/foo.txt")
將從“this”的類加載器和xyz包加載資源(它將需要與該包中的類位于同一目錄中)。
Thread.currentThread().getContextClassLoader().getResource(name)
將加載上下文類加載器,但不會根據(jù)任何包解析名稱(必須絕對引用)
System.class.getResource(name)
將使用系統(tǒng)類加載器加載資源(它必須被絕對引用,因為您將無法將任何內(nèi)容放入java.lang包(System的包)中。
只需看看來源。還表明getResourceAsStream只是在getResource返回的URL上調(diào)用“openStream”并返回它。

TA貢獻1856條經(jīng)驗 獲得超5個贊
好吧,如果你真的在派生類中,它部分取決于你想要發(fā)生什么。
例如,假設(shè)SuperClass
在A.jar中并且SubClass
在B.jar中,并且您正在聲明的實例方法中執(zhí)行代碼,SuperClass
但where this
指的是實例SubClass
。如果你使用this.getClass().getResource()
它將看起來相對于SubClass
B.jar。我懷疑通常不是必需的。
就個人而言,我可能Foo.class.getResourceAsStream(name)
最常使用- 如果你已經(jīng)知道你所追求的資源的名稱,并且你確定它的相對位置Foo
,那就是IMO最強大的做法。
當(dāng)然,有時候這也不是你想要的:根據(jù)每個案例的優(yōu)點來判斷。它只是“我知道這個資源與這個類捆綁在一起”是我遇到的最常見的一個。

TA貢獻1852條經(jīng)驗 獲得超1個贊
我搜索三個地方,如下所示。歡迎評論。
public URL getResource(String resource){ URL url ; //Try with the Thread Context Loader. ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if(classLoader != null){ url = classLoader.getResource(resource); if(url != null){ return url; } } //Let's now try with the classloader that loaded this class. classLoader = Loader.class.getClassLoader(); if(classLoader != null){ url = classLoader.getResource(resource); if(url != null){ return url; } } //Last ditch attempt. Get the resource from the classpath. return ClassLoader.getSystemResource(resource);}
添加回答
舉報