真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java.lang.ClassLoader與java.net.URLClassLoader學(xué)習(xí)

第一部分:java.lang.ClassLoader

為湛河等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及湛河網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計、成都網(wǎng)站制作、湛河網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

類加載器(class loader)用來加載 Java 類到 Java 虛擬機(jī)中。一般來說,Java 虛擬機(jī)使用 Java 類的方式如下:Java 源程序(.java 文件)在經(jīng)過 Java 編譯器編譯之后就被轉(zhuǎn)換成 Java 字節(jié)代碼(.class 文件)。類加載器負(fù)責(zé)讀取 Java 字節(jié)代碼,并轉(zhuǎn)換成 java.lang.Class 類的一個實例。每個這樣的實例用來表示一個 Java 類。通過此實例的 newInstance()方法就可以創(chuàng)建出該類的一個對象。實際的情況可能更加復(fù)雜,比如 Java 字節(jié)代碼可能是通過工具動態(tài)生成的,也可能是通過網(wǎng)絡(luò)下載的。 基本上所有的類加載器都是 java.lang.ClassLoader 類的一個實例

  1. 構(gòu)造函數(shù)

public abstract class ClassLoader
   
private static native void registerNatives();
    static {
        registerNatives();
    }
    
private ClassLoader(Void unused, ClassLoader parent) {
        this.parent = parent;
        if (ParallelLoaders.isRegistered(this.getClass())) {
            parallelLockMap = new ConcurrentHashMap<>();
            package2certs = new ConcurrentHashMap<>();
            domains =
                Collections.synchronizedSet(new HashSet());
            assertionLock = new Object();
        } else {
            // no finer-grained lock; lock on the classloader instance
            parallelLockMap = null;
            package2certs = new Hashtable<>();
            domains = new HashSet<>();
            assertionLock = this;
        }
    }

2.loadClass方法,該方法為類加載器的主要方法,具體代碼如下:

    

 protected Class loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            //1.異步保護(hù),防止重復(fù)加載同一個class
        synchronized (getClassLoadingLock(name)) {
            //2.首先,檢查是否類已經(jīng)被加載過了
            Class c = findLoadedClass(name);
            if (c == null) {
            //2.1如果該類未被加載過
                    //2.1.1 System.nanoTime()這個方法主要是返回一個系統(tǒng)計時器的當(dāng)前值,以毫微秒為單位。但是不能用作來計算當(dāng)前時間,只能通過end-start算出間隔時間
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                    //2.1.2如果有父加載器,即父加載器不為初始加載器,則遞歸父加載器查看是否加載過
                        c = parent.loadClass(name, false);
                    } else {
                    //2.1.3如果沒有父加載器,即父加載器為初始加載器,查找類是否加載,具體看方法
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    //2.1.4如果還是沒有該類,則運(yùn)行findClass方法加載,該方法為虛方法
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
            //解析class,resolve默認(rèn)為false
                resolveClass(c);
            }
            return c;
        }
    }

3.getClassLoadingLock(name)方法

 protected Object getClassLoadingLock(String className) {
        Object lock = this;
        if (parallelLockMap != null) {
            Object newLock = new Object();
            lock = parallelLockMap.putIfAbsent(className, newLock);
            if (lock == null) {
                lock = newLock;
            }
        }
        return lock;
    }


4.findLoadedClass(name)方法

   protected final Class findLoadedClass(String name) {
        if (!checkName(name))
            return null;
        return findLoadedClass0(name);
    }

    private native final Class findLoadedClass0(String name);

5.findBootstrapClassOrNull(name)方法

 private Class findBootstrapClassOrNull(String name)
    {
        if (!checkName(name)) return null;

        return findBootstrapClass(name);
    }

    // return null if not found
    private native Class findBootstrapClass(String name);

6.findClass(name)方法,該方法在ClassLoader中沒有具體實現(xiàn),因此根據(jù)不同的情況會重寫該方法進(jìn)行不同情況的判斷。

 protected Class findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    }

7.resolveClass(Class c)方法

 protected final void resolveClass(Class c) {
        resolveClass0(c);
    }

    private native void resolveClass0(Class c);

8.defineClass方法,主要是將字節(jié)碼class文件進(jìn)行實例為Class實例。該方法不可覆蓋,我們在繼承ClassLoader的時候,會重寫findClass方法將相關(guān)文件轉(zhuǎn)換成jvm可識別的Class實例。必須要在重寫的findClass中調(diào)用defineClass才可以完成轉(zhuǎn)換的邏輯。

    

protected final Class defineClass(String name, byte[] b, int off, int len)
        throws ClassFormatError
    {
        return defineClass(name, b, off, len, null);
    }
 protected final Class defineClass(String name, byte[] b, int off, int len,
                                         ProtectionDomain protectionDomain)
        throws ClassFormatError
    {
        protectionDomain = preDefineClass(name, protectionDomain);
        String source = defineClassSourceLocation(protectionDomain);
        Class c = defineClass1(name, b, off, len, protectionDomain, source);
        postDefineClass(c, protectionDomain);
        return c;
    }

9.ClassLoader類的相關(guān)測試。


新聞名稱:java.lang.ClassLoader與java.net.URLClassLoader學(xué)習(xí)
網(wǎng)頁地址:http://weahome.cn/article/gegdpo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部