1. 程式人生 > >this.getClass().getClassLoader().getResource("");

this.getClass().getClassLoader().getResource("");

        <1> 呼叫物件的getClass()方法是獲得物件當前的類型別,這部分資料存在方法區中。
        <2>類型別上呼叫getClassLoader()方法是得到當前型別的類載入器。
        我們知道在Java中所有的類都是通過類載入器載入到虛擬機器中的,而且類載入器之間存在父子關係,就是子知道父,父不知道子,這樣不同的子載入的型別之間是無法訪問的(雖然它們都被放在方法區中),所以在這裡通過當前類的載入器來載入資源也就是保證是和類型別同一個載入器載入的。最後呼叫了類載入器的getResourceAsStream()方法來載入資源。返回讀取到的資源的輸入流。getResource()獲取其URL。
     經常希望通過ClassName.class.getClassLoader().getResourceAsStream(““)來取得properties檔案.通常:ClassName.class.getClassLoader().getResourceAsStream(““)取得的是WEB-INF的下級目錄,比如ClassName.class.getClassLoader().getResourceAsStream(“db.properties“).在Tomcat中,可以通過增加”../”來取得上層目錄,即WEB-INF目錄,這樣就可以把properties放在WEB-INF中統一管理。但是WLS不識別”../”。   另外一種土辦法,就是不返回classLoader,直接ClassName.class.getResourceAsStream()。然後通過多個”../”(小於6個)來返回相應的上級目錄。當然,如果類擴充套件了HttpServlet,可以通過getServletContext().getRealPath("/")來取得Web部署目錄的絕對路徑。 
     getClass():取得當前物件所屬的Class物件   
     getClassLoader():取得該Class物件的類裝載器
      裝載類的過程非常簡單:查詢類所在位置,並將找到的Java類的位元組碼裝入記憶體,生成對應的Class物件。Java的類裝載器專門用來實現這樣的過程,JVM並不止有一個類裝載器,事實上,如果你願意的話,你可以讓JVM擁有無數個類裝載器,當然這除了測試JVM外,我想不出還有其他的用途。你應該已經發現到了這樣一個問題,類裝載器自身也是一個類,它也需要被裝載到記憶體中來,那麼這些類裝載器由誰來裝載呢,總得有個根吧?沒錯,確實存在這樣的根,它就是神龍見首不見尾的Bootstrap ClassLoader. 為什麼說它神龍見首不見尾呢,因為你根本無法在Java程式碼中抓住哪怕是它的一點點的尾巴,儘管你能時時刻刻體會到它的存在,因為java的執行環境所需要的所有類庫,都由它來裝載,而它本身是C++寫的程式,可以獨立執行,可以說是JVM的執行起點,偉大吧。在Bootstrap完成它的任務後,會生成一個AppClassLoader(實際上之前系統還會使用擴充套件類裝載器ExtClassLoader,它用於裝載Java執行環境擴充套件包中的類),這個類裝載器才是我們經常使用的,可以呼叫ClassLoader.getSystemClassLoader() 來獲得,我們假定程式中沒有使用類裝載器相關操作設定或者自定義新的類裝載器,那麼我們編寫的所有java類通通會由它來裝載,值得尊敬吧。AppClassLoader查詢類的區域就是耳熟能詳的Classpath,也是初學者必須跨過的門檻,有沒有靈光一閃的感覺,我們按照它的類查詢範圍給它取名為類路徑類裝載器。還是先前假定的情況,當Java中出現新的類,AppClassLoader首先在類傳遞給它的父類類裝載器,也就是Extion ClassLoader,詢問它是否能夠裝載該類,如果能,那AppClassLoader就不幹這活了,同樣Extion ClassLoader在裝載時,也會先問問它的父類裝載器。我們可以看出類裝載器實際上是一個樹狀的結構圖,每個類裝載器有自己的父親,類裝載器在裝載類時,總是先讓自己的父類裝載器裝載(多麼尊敬長輩),如果父類裝載器無法裝載該類時,自己就會動手裝載,如果它也裝載不了,那麼對不起,它會大喊一聲:Exception,class not found。有必要提一句,當由直接使用類路徑裝載器裝載類失敗丟擲的是NoClassDefFoundException異常。如果使用自定義的類裝載器loadClass方法或者ClassLoader的findSystemClass方法裝載類,如果你不去刻意改變,那麼丟擲的是ClassNotFoundException。
這裡jdk告訴我們:如果一個類是通過bootstrap 載入的,那我們通過這個類去獲得classloader的話,有些jdk的實現是會返回一個null的,比如說我用 new Object().getClass().getClassLoader()的話,會返回一個null,這樣的話上面的程式碼就會出現NullPointer異常.所以保險起見我們最好還是使用我們自己寫的類來獲取classloader("this.getClass().getClassLoader()“),這樣一來就不會有問題。儘量不要使用提供的封裝類來獲取他的載入器。因為這樣會報空指標我們應該使用我們自定義的類來獲取它的類載入器。

相關推薦

this.getClass().getClassLoader().getResourcethis.getClass().getResource的區別和聯絡

專案路徑: classLoader.getResource(name) 該方法的作用與class.getResource(name)的作用一樣,接收一個表示路徑的引數,返回一個URL物件,該URL物件表示name對應的資源(檔案)。但是,與class.getR

this.getClass().getClassLoader().getResource("");

        <1> 呼叫物件的getClass()方法是獲得物件當前的類型別,這部分資料存在方法區中。         <2>類型別上呼叫getClassLoader()方法是得到當前型別的類載入器。         我們知道在Java中所有的類

this.getClass().getClassLoader().getResource路徑位置

System.out.println(this.getClass()); System.out.println(this.getClass().getClassLoader()); System.out.println(this.getClass().getClassLoa

zbb20170604 java file 路徑 this.getClass().getResource(String) 路徑問題

默認 文件同步 ron 編譯運行 str 當前 斜杠 區別 java、 this.getClass().getResource(String) 路徑問題 這裏的默認當前路徑是該類所在目錄; this.getClass() 說明了一切!! this.getCla

Java在不同環境下獲取當前路徑的方法--this getClass getResource

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析

this.class.getClassLoader()解析java是面嚮物件語言,面向物件的語言的宗旨就是萬事萬物皆物件,那麼類、類裡面的屬性和方法都是物件。java裡面的所有的類都是Class類的物件,this.class是獲得這個類相對於Class類的物件。 getCl

this.class.getClassLoader().getResourceAsStream與this.class.getResourceAsStream

isarray admin comm ext 修改 string class template 沒有 本文轉自:http://xixinfei.iteye.com/blog/1256291 this.getClass().getClassLoader().getResour

xxx.class.getClassLoader().getResource("xxx").getPath()這句話報錯空指標

今天跟著網上的教程自己寫了一個簡易的spring的IOC仿寫程式,然後解析xml檔案都是自己寫的,在執行的時候去獲取.xml的路徑的時候呼叫了xxx.class.getClassLoader().getResource("xxx").getPath()這個方法去獲取,然後報錯空指標,debug以後發

Java class.getClassLoader().getResource("")獲取資源路徑

Java web專案打包部署時發現出現平時開發過程中沒有出現的錯誤,檢視日誌發現是因為程式碼中 獲取配置檔案路徑有誤。 一、錯誤分析 專案中程式碼: webRootPath = MySqlDbPoolConnection.class.getClassLoader().getRe

理解根目錄,getClass().getResourceAsStream和getClass().getClassLoader().getResourceAsStream的區別

  1理解根目錄: 經常會看到如下配置: <value>classpath*:/application.properties</value>  <value>classpath:/application.properties&

Java class.getClassLoader().getResource("")獲取資源路徑

Java web專案打包部署時發現出現平時開發過程中沒有出現的錯誤,檢視日誌發現是因為程式碼中 獲取配置檔案路徑有誤。 一、錯誤分析 專案中程式碼: webRootPath = MySqlDbPoolConnection.class.getClassLo

this.class.getClassLoader().getResourceAsStream

JAVA執行時,首先會在指定的類路徑下(classpath路徑下)搜尋JAVA編譯後的位元組碼檔案(class檔案),然後通過類載入器載入到虛擬機器中。 DBConn.class.getClassLoader().getResourceAsStream("database.properties") 1、DBC

【轉載】java文件路徑問題及getResourcegetClassLoader().getResource的區別

場景 article 文件 存在 info com rate () 分享圖片 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u012572955/article/details/52880520我們經常在java的io操作

關於getClass(),Object.class,getClassLoader的理解

1、對Class類的理解:Class類包含了類的資訊,如構造方法、方法、屬性,可用於反射。以下是所有方法 2、獲取Class類物件的集中方法: Test test = new Test(); (1).test.getClass();      在執行時確

getClass()和getClassLoader()區別 以及ClassLoader詳解及用途(檔案載入,類載入)

 1.1 幾個相關概念ClassLoader負責載入系統的所有Resources(Class,檔案,來自網路的位元組流等),通過ClassLoader從而將資源載入JVM   每個class都有一個reference,指向自己的ClassLoader。Class.getClassLoader()   arra

十分鐘徹底理解javascript 的 this指向,不懂請砸店

hub 改變 alert blog var rip def 徹底 文章 函數的this指向誰,和函數在哪裏被定義的,函數在哪裏被執行的沒有半毛錢關系,只遵守下面的規律: 在非嚴格模式中: 1、自執行函數裏面,this永遠指向window; <script

SQL Server導入報錯:The LocaleID 4 is not installed on this system

code page localeid 936 問題描述:通過SQLServer導入導出向導導入中文字符集數據,遇到The LocaleID 4 is not installed on this system.錯誤。解決方法:我發現客戶服務器操作系統雖然不支持Chinese (Simplified)

javascript裏上下文this的理解和call()使用

指向 asc 傳遞 bsp say animal 指定 nim strong call 方法 語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 大概寫法:call(Object,arg1,arg2,...); 定義:調用一個對

this的綁定方式

script 執行 var 默認 foreach 不知道 可能 表達 原型 默認綁定 函數調用時綁定window,在嚴格模式下不會綁定到全局對象 function foo(){ console.log(this.a); } var a = 10; foo();

面向對象關於函數以及this的問題

argument 實例對象 show urn foo 返回值 nload 改變 定義 函數在js中扮演的角色 1、普通函數 function foo(){ console.log(1); } foo(); 2、構造函數