想獲取resources下的文件,之前用過this.getClass().getClassLoader().getResourceAsStream(path);可以獲取到,但最近的一個工程中需要在一個靜態方法中獲取該文件,沒有了this,我直接用了Class.class.getClassLoader().getResourceAsStream(path),結果發現返回爲null。
原因:
提到這裏不得不提一下jvm的類加載機制。自上而下加載,自下而上檢查。
最開始是由BootStrap ClassLoader加載rt.jar下的文件,也就是java最最核心的部分;然後由Extension ClassLoader加載ext下的文件;再有App ClassLoader加載用戶自己的文件。
由於BootStrap ClassLoader是用c++寫的,所以在返回該ClassLoader時會返回null。顯然,Class爲java.lang.Class,是rt.jar中的,由BootStrap ClassLoader加載,所以返回null。
解決方案:
用自己編寫的類的類名去獲取ClassLoader。