安卓高手之路之ClassLoader(三),安卓classloader

來源:互聯網
上載者:User

安卓高手之路之ClassLoader(三),安卓classloader

由於看C++和C代碼看得很累,很辛苦。上一章終於解脫到java代碼中來了。 第一個getClassLoader發生在main的preload方法中,

 

public static void main(String argv[]) {

 preload();

}

Java代碼  
  1. static void preload() {  
  2.     preloadClasses();  
  3.     preloadResources();  
  4. }  

 

Java代碼  
  1. private static void preloadClasses() {  
  2.        final VMRuntime runtime = VMRuntime.getRuntime();  
  3.   
  4.        InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(  
  5.                PRELOADED_CLASSES);  

 可以看到,直接調用了getClassLoader()這個classLoader是個什麼東西呢。

 

Java代碼  
  1. public ClassLoader getClassLoader() {  
  2.        if (this.isPrimitive()) {  
  3.            return null;  
  4.        }  
  5.   
  6.        ClassLoader loader = getClassLoaderImpl();  
  7.        if (loader == null) {  
  8.            loader = BootClassLoader.getInstance();  
  9.        }  
  10.        return loader;  
  11.    }  

 由於這個類是沒有classloader的,因此調用的是BootClassLoader.getInstance().

  

Java代碼  
  1. /** 
  2.  * Provides an explicit representation of the boot class loader. It sits at the 
  3.  * head of the class loader chain and delegates requests to the VM's internal 
  4.  * class loading mechanism. 
  5.  */  
  6. class BootClassLoader extends ClassLoader {  

 

現在明白了吧。BootClassLoader原來就是第一個class的ClassLoader。對於Zygote是com.android.internal.os.ZygoteInit,對於其他的,那就是com.android.internal.os.RuntimeInit 的classloader。也就是init.rc中指定的BOOTCLASSPATH指定的classLoader。

現在看另外一個方法也就是RuntimeInit 的載入

Java代碼  
  1. const char* envStr = getenv("CLASSPATH");  
  2.    if (envStr != NULL) {  
  3.        gDvm.classPathStr = strdup(envStr);  
  4.    } else {  
  5.        gDvm.classPathStr = strdup(".");  
  6.    }  

 

Java代碼  
  1. handleChildProc  

 

Java代碼  
  1. else {  
  2.                     cloader = ClassLoader.getSystemClassLoader();  
  3.                 }  
  4.   
  5.                 try {  
  6.                     ZygoteInit.invokeStaticMain(cloader, className, mainArgs);  

 

 ClassLoader.getSystemClassLoader();這個classLoader與普通的classLoader又有不同。這個是一個PathClassLoader 這個以BootClassLoader作為父Loader。這很明顯是一個裝飾者模式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.