查了一些資料也不是太明白兩個的區別,可是前者是最安全的用法java
打個簡單的比方,你一個WEB程序,發佈到Tomcat裏面運行。
首先是執行Tomcat org.apache.catalina.startup.Bootstrap類,這時候的類加載器是ClassLoader.getSystemClassLoader()。
而咱們後面的WEB程序,裏面的jar、resources都是由Tomcat內部來加載的,因此你在代碼中動態加載jar、資源文件的時候,首先應該是使用Thread.currentThread().getContextClassLoader()。若是你使用Test.class.getClassLoader(),可能會致使和當前線程所運行的類加載器不一致(由於Java天生的多線程)。
Test.class.getClassLoader()通常用在getResource,由於你想要獲取某個資源文件的時候,這個資源文件的位置是相對固定的。apache
java的類加載機制(jvm規範)是委託模型,簡單的說,若是一個類加載器想要加載一個類,首先它會委託給它的parent去加載,若是它的全部parent都沒有成功的加載那麼它纔會本身親自來,有點兒像兒子使喚老子的感受。bootstrap
若是你使用Test.class.getClassLoader(),可能會致使和當前線程所運行的類加載器不一致 :Class.getClassLoader()
returns the class loader for the class. Some implementations may use null to represent the bootstrap class loader. This method will return null in such implementations if this class was loaded by the bootstrap class loader.安全