編寫自己的ClassLoader時設定Thread的contextClassLoader

denglt發表於2013-04-11
中說到啟動JVM時可以通過設定java.system.class.loader來指定自己編寫的classloader.
 
當設定java.system.class.loader時:
通過Thread.currentThread().getContextClassLoader()獲取的ClassLoader將是使用者指定的;
 
這個在編寫自己的ClassLoader時很重要,因為有些開源專案的程式碼會通過Thread.currentThread().getContextClassLoader()來獲取ClassLoader.
如spring就是這樣:
org.springframework.util.ClassUtils中:
 public static ClassLoader getDefaultClassLoader() {
  ClassLoader cl = null;
  try {
   cl = Thread.currentThread().getContextClassLoader();
  }
  catch (Throwable ex) {
   logger.debug("Cannot access thread context ClassLoader - falling back to system class loader", ex);
  }
  if (cl == null) {
   // No thread context class loader -> use class loader of this class.
   cl = ClassUtils.class.getClassLoader();
  }
  return cl;
 }
 
 
如Tomcat啟動時沒有通過設定java.system.class.loader來指定自己的ClassLoader的,但它設定了Thread的contextClassLoader為
WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------&gt Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@31d91824
 
()
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-758288/,如需轉載,請註明出處,否則將追究法律責任。

相關文章