一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

javaEE防盜版-java之類加載

 WindySky 2017-12-01

前言

        類加載技術(shù)是java運(yùn)行的核心部分之一,雖然對(duì)于開發(fā)來說運(yùn)用到此技術(shù)的地方不多,但是作為JAVAEE防盜版技術(shù)的組成部分之一,這一部分對(duì)于研發(fā)來說也需要著重了解。
本文分析對(duì)象針對(duì)于:JDK1.7

JVM預(yù)定義的三種類加載器

1.啟動(dòng)類加載器:啟動(dòng)類裝入器是用本地代碼實(shí)現(xiàn)的類裝入器,它負(fù)責(zé)將JRE/lib下面的核心類庫或-Xbootclasspath選項(xiàng)指定的jar包加載到內(nèi)存中。由于其涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開發(fā)者無法直接獲取到啟動(dòng)類加載器的引用。

2.擴(kuò)展類加載器:擴(kuò)展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將JRE/lib/ext或者由系統(tǒng)變量-Djava.ext.dir指定位置中的類庫加載到內(nèi)存中。開發(fā)者可以直接使用標(biāo)準(zhǔn)擴(kuò)展類加載器。

3.系統(tǒng)類加載器:系統(tǒng)類加載器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將系統(tǒng)類路徑java -classpath-Djava.class.path變量所指的目錄下的類庫加載到內(nèi)存中。開發(fā)者可以直接使用系統(tǒng)類加載器。

類加載的雙親委派機(jī)制

        JVM在加載類時(shí)默認(rèn)采用的是雙親委派機(jī)制。通俗的講,就是某個(gè)特定的類加載器在接到加載類的請(qǐng)求時(shí),首先將加載任務(wù)委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回;只有父類加載器無法完成此加載任務(wù)時(shí),才自己去加載。關(guān)于虛擬機(jī)默認(rèn)的雙親委派機(jī)制,我們可以從系統(tǒng)類加載器和擴(kuò)展類加載器為例作簡單分析。

圖1.1 ExtClassLoader和AppClassLoader繼承結(jié)構(gòu)圖

        由圖1.1可以看到,擴(kuò)展類加載器和系統(tǒng)類加載器的層次結(jié)構(gòu)一致,并且查看源碼可知,系統(tǒng)類加載器的構(gòu)造器和擴(kuò)展類加載器的構(gòu)造器在創(chuàng)建時(shí)最終都會(huì)調(diào)用ClassLoader的帶參構(gòu)造器,并將父構(gòu)造器注冊(cè)到其中(圖1.2)。

圖1.2 擴(kuò)展類加載器的構(gòu)建過程,指定父類加載器為null
由于可以看出來,擴(kuò)展類加載器在構(gòu)建時(shí)候就指定了父加載器,并且ClassLoader類的parent方法權(quán)限為private,并且沒有提供setter方法。并且擴(kuò)展類加載器的父加載器被設(shè)置為了null。
        同理,系統(tǒng)類加載器的父加載器被設(shè)置為了ExtClassLoader(圖1.3)。

圖1.3 系統(tǒng)類加載器的構(gòu)建過程,指定父類加載器為ExtClassLoader
        用代碼來檢測一下:
  1. package com.noryar.classloader.test;  
  2. public class ClassLoaderTest {  
  3.     public static void main(String[] args) {  
  4.         System.out.println("系統(tǒng)類加載器為:"+ClassLoader.getSystemClassLoader());  
  5.         System.out.println("擴(kuò)展類加載器為:"+ClassLoader.getSystemClassLoader().getParent());  
  6.         System.out.println("啟動(dòng)類加載器為:"+ClassLoader.getSystemClassLoader().getParent().getParent());  
  7.     }  
  8. }  

        運(yùn)行結(jié)果如下,符合預(yù)期:
  1. 系統(tǒng)類加載器為:sun.misc.Launcher$AppClassLoader@1b31c23  
  2. 擴(kuò)展類加載器為:sun.misc.Launcher$ExtClassLoader@1fc7b3a  
  3. 啟動(dòng)類加載器為:null  

        OK,說了這么多,接下來介紹一下雙親委派機(jī)制的實(shí)現(xiàn)。首先我們分析一下ClassLoader這個(gè)抽象類的幾個(gè)重要方法。
  1. public abstract class ClassLoader {  
  2.     // 用指定的二進(jìn)制名稱加載類,它會(huì)通知JVM去解析類信息。  
  3.     public Class<?> loadClass(String name) throws ClassNotFoundException {  
  4.         return loadClass(name, false);  
  5.     }  
  6.   
  7.     // 用指定的二進(jìn)制名稱加載類,具體的實(shí)現(xiàn)流程如下:  
  8.     // 1. 使用findLoadedClass(String)方法來檢測該類是否已被加載  
  9.     // 2. 調(diào)用父加載器的loadClass(String)方法,這里就是雙親委派機(jī)制的實(shí)現(xiàn)邏輯  
  10.     // 3. 調(diào)用findClass來尋找類  
  11.     protected Class<?> loadClass(String name, boolean resolve)  
  12.         throws ClassNotFoundException  
  13.     {  
  14.         ....  
  15.     }  
  16.       
  17.     // 使用指定的二進(jìn)制名稱尋找類。該應(yīng)當(dāng)在ClassLoader的子類中進(jìn)行重寫,并且會(huì)被loadClass方法調(diào)用。  
  18.     protected Class<?> findClass(String name) throws ClassNotFoundException {  
  19.         throw new ClassNotFoundException(name);  
  20.     }  
  21.       
  22.     // 將字節(jié)碼文件轉(zhuǎn)換成實(shí)體類,被findClass方法調(diào)用  
  23.     // 次方法調(diào)用本地方法,因此在開發(fā)中無需復(fù)寫。  
  24.     protected final Class<?> defineClass(String name, byte[] b, int off, int len,  
  25.                                          ProtectionDomain protectionDomain)  
  26.         throws ClassFormatError  
  27.     {  
  28.         ....  
  29.      }  
  30. }  
        檢查發(fā)現(xiàn)ClassLoader的子類只對(duì)loadClass方法進(jìn)行了擴(kuò)展(主要是增加了一些校驗(yàn)),并沒有對(duì)其調(diào)用機(jī)理做根本改變,因此,雙親委派機(jī)制的實(shí)現(xiàn)只要分析ClassLoader的loadClass(String name, boolean resolve)方法即可。下面是該方法的具體實(shí)現(xiàn)(圖1.4)。

圖1.4 ClassLoader的loadClass方法實(shí)現(xiàn)
綜上所述,當(dāng)一個(gè)類需要加載的時(shí)候,當(dāng)前類加載器就會(huì)一級(jí)一級(jí)的調(diào)用系統(tǒng)類加載器->擴(kuò)展類加載器->啟動(dòng)類加載器進(jìn)行加載,并且最終由啟動(dòng)類加載器首先嘗試加載,加載失敗在給擴(kuò)展類加載器加載,失敗在給系統(tǒng)類加載,失敗給當(dāng)前類加載器加載。任意一級(jí)加載成功則直接返回,如果都失敗,則拋出ClassNotFoundException異常。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产亚州欧美一区二区| av免费视屏在线观看| 91日韩欧美在线视频| 国产精品人妻熟女毛片av久久| 国产在线观看不卡一区二区| 亚洲国产av一二三区| 日本免费一区二区三女| 欧美黑人暴力猛交精品| 好骚国产99在线中文| 麻豆印象传媒在线观看| 亚洲中文字幕日韩在线| 欧美不卡高清一区二区三区| 99在线视频精品免费播放| 久久经典一区二区三区| 99久久无色码中文字幕免费| 国产一区二区三区四区免费| 日韩人妻免费视频一专区| 超薄肉色丝袜脚一区二区| 中日韩美一级特黄大片| 中文字幕精品一区二区年下载| 欧美人妻免费一区二区三区| 国产精品免费视频视频| 中文字幕一区二区三区中文| 国产精品午夜福利免费在线| 一区二区三区亚洲国产| 国产一级特黄在线观看| 国产免费无遮挡精品视频 | 国产福利一区二区久久| 亚洲成人免费天堂诱惑| 国产又长又粗又爽免费视频| 精品久久av一二三区| 亚洲一区二区欧美激情| 国产亚洲欧美自拍中文自拍| 午夜色午夜视频之日本| 情一色一区二区三区四| 国产精品香蕉在线的人| 日本久久中文字幕免费| 一区二区三区免费公开| 国产不卡免费高清视频| 狠狠亚洲丁香综合久久| 女生更色还是男生更色|