zoukankan      html  css  js  c++  java
  • 安卓高手之路之ClassLoader(三)

    安卓高手之路之ClassLoader(三) - 修补C++ - ITeye技术网站

    由于看C++和C代码看得很累,很辛苦。上一章终于解脱到java代码中来了。 第一个getClassLoader发生在main的preload方法中,

    public static void main(String argv[]) {

     preload();

    }

    Java代码  收藏代码
    1. static void preload() {  
    2.     preloadClasses();  
    3.     preloadResources();  
    4. }  
        static void preload() {
            preloadClasses();
            preloadResources();
        }
    Java代码  收藏代码
    1. private static void preloadClasses() {  
    2.        final VMRuntime runtime = VMRuntime.getRuntime();  
    3.   
    4.        InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(  
    5.                PRELOADED_CLASSES);  
     private static void preloadClasses() {
            final VMRuntime runtime = VMRuntime.getRuntime();
    
            InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(
                    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.    }  
     public ClassLoader getClassLoader() {
            if (this.isPrimitive()) {
                return null;
            }
    
            ClassLoader loader = getClassLoaderImpl();
            if (loader == null) {
                loader = BootClassLoader.getInstance();
            }
            return loader;
        }

     由于这个类是没有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 {  
    /**
     * Provides an explicit representation of the boot class loader. It sits at the
     * head of the class loader chain and delegates requests to the VM's internal
     * class loading mechanism.
     */
    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.    }  
     const char* envStr = getenv("CLASSPATH");
        if (envStr != NULL) {
            gDvm.classPathStr = strdup(envStr);
        } else {
            gDvm.classPathStr = strdup(".");
        }
    Java代码  收藏代码
    1. handleChildProc  
    handleChildProc
    Java代码  收藏代码
    1. else {  
    2.                     cloader = ClassLoader.getSystemClassLoader();  
    3.                 }  
    4.   
    5.                 try {  
    6.                     ZygoteInit.invokeStaticMain(cloader, className, mainArgs);  
    else {
                        cloader = ClassLoader.getSystemClassLoader();
                    }
    
                    try {
                        ZygoteInit.invokeStaticMain(cloader, className, mainArgs);

     ClassLoader.getSystemClassLoader();这个classLoader与普通的classLoader又有不同。这个是一个PathClassLoader 这个以BootClassLoader作为父Loader。这很明显是一个装饰者模式。

  • 相关阅读:
    hdu2155 小黑的镇魂曲(dp)
    hdu2155 小黑的镇魂曲(dp)
    hdu2158 最短区间版大家来找碴
    hdu2158 最短区间版大家来找碴
    hdu2102 水搜索
    hdu2102 水搜索
    hdu 2058 枚举区间和个数
    hdu 2058 枚举区间和个数
    hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
    hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
  • 原文地址:https://www.cnblogs.com/seven1979/p/4369604.html
Copyright © 2011-2022 走看看