亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java 類加載器

2019-11-14 22:18:01
字體:
來源:轉載
供稿:網友
java 類加載器類加載器說明

類加載器負責將.class文件加載到內存中,并為類生成一個java.lang.Class實例。

一旦一個類被加載入JVM中,同一個類就不會被再次加入了。在JVM中用來判斷類的唯一性標識是:類名、類所在的包名和類加載器。

當JVM啟動時,會形成由三個類加載器組成的初始類加載器層次結構:

  • BootStrap ClassLoader:根類加載器;
  • Extension ClassLoader:擴展類加載器;
  • System ClassLoader:系統類加載器。

根類加載器,負責加載java的核心類(即JAVA_HOME/jre/lib下的jar包)。當使用-Xbootclasspath選項或使用-D選項指定sun.boot.class.path系統屬性也可以指定加載附加的類。根類加載器比較特殊,他并不是java.lang.ClassLoader的子類,而是由JVM自身實現的。

擴展類加載器,負責加載JRE的擴展目錄(即JAVA_HOME/jre/lib/ext目錄)下的jar包。

系統類加載器,負責在JVM啟動時,加載來自命令java中的-classpath選項或java.class.path系統屬性,或CLASSPATH環境變量所指定的jar包和類路徑,或者是當前類路徑。程序可以通過ClassLoader的靜態方法getSystemClassLoader()方法獲取系統類加載器。

除了Java提供的這三種類加載器,開發者也可以實現自己的類加載器,自定義的類加載器通過繼承ClassLoader來實現。

JVM中這四種類加載器的層次結構如圖:

image

如圖所示:根類加載器是擴展類加載器的父類加載器;擴展類加載器是系統類加載器的父類加載器;如果沒有特別指定,用戶自定義的類加載器都以系統類加載器作為父加載器。

需要提下,類加載器之間的父子關系并不是類繼承上的父子關系,而是類加載器實例之間的關系。

類加載機制

JVM的類加載機制主要有如下三種機制:

  • 全盤負責:全盤負責機制是說當一個類加載器負責加載某個類的時候,該類所依賴的和引用的其他類也將由該類加載器負責載入,除非顯式使用另一個類加載器來載入;
  • 父類委托:父類委托機制是說當一個類加載器負責加載某個類的時候,先讓父類加載器嘗試載入該類,若無法載入,才嘗試從自己的類路徑中載入;
  • 緩存機制:緩存機制會保證所有被加載過的類都會被緩存。當一個類加載器負責加載某個類的時候,會先從緩存中搜尋該類,只有當緩存中不存在該類對象時,才會載入該類并存放于緩存中。這也是為什么我們修改了某個類以后需要重啟動JVM,所做的調整才會生效的原因。

類加載器加載類大致要經過8個步驟:

  1. 檢測目標類是否有載入過(即在緩存中是否有這個類),如果有,則直接進入第八步;
  2. 如果父加載器不存在(父加載器不存在有兩種情形,一是當前加載器的parent是根加載器,二是當前加載器就是根加載器),則跳到第四步執行;如果父加載器存在,則執行第三步;
  3. 請求父加載器載入目標類,如果成功跳到第八步,不成功則跳到第五步;
  4. 請求使用根加載器加載目標類,如果成功跳到第八步,不成功則跳到第七步;
  5. 尋找.class文件(從相關的類加載器的加載路徑中查找),如果找到則執行第六部,找不到則執行第七步;
  6. 從文件中載入類,成功載入則跳到第八步;
  7. 拋出ClassNotFoundException;
  8. 返回類。
自定義類加載器

JVM中除了根類加載器之外的類加載器都是ClassLoader的子類的實例。開發者可以通過繼承ClassLoader,并重寫ClassLoader的方法來實現自定義類加載器。

ClassLoader類有三個關鍵方法:

  • loadClass(String name, boolean resolve):該方法為ClassLoader的入口點,根據指定的二進制名稱來加載類;
  • findClass(String name):根據指定的二進制名稱來查找類;
  • defineClass(String name, byte[] b, int off, int len):將指定類的字節碼文件(即.class文件)讀入字節數組byte[] b內,并把它轉為Class對象,該字節碼文件可以來源于網絡或磁盤。

要實現自定義的ClassLoader,可以通過重寫loadClass或findClass來實現。不過一般推薦重寫findClass,而不是loadClass,看一下loadClass的執行步驟:

  • 用findLoadClass來檢查是否已經加載類,如果已經加載則直接返回;
  • 在父類加載器上調用loadClass方法。如果父類加載器為null,則使用根類加載器來加載;
  • 調用findClass方法來查找類。

從上面看來,采用重寫findClass的方法可以避免覆蓋默認類加載器的父類委托和緩存機制兩種策略。

以下是一個自定類加載器的實例:

package com.zhyea.test;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.Method;/** * 自定義類加載器實例 * @author robin * */public class MyClassLoader extends ClassLoader {    /**     * 讀取類文件     *      * @param filePath     *            類文件路徑     * @return     * @throws IOException     */    PRivate byte[] getBytes(String filePath) throws IOException {        InputStream in = null;        try {            File file = new File(filePath);            long length = file.length();            in = new FileInputStream(file);            byte[] buffer = new byte[(int) length];            int hasRead = in.read(buffer);            if (hasRead != length) {                throw new IOException("無法讀取全部文件:" + hasRead + "!=" + length);            }            return buffer;        } finally {            if (null != in)                in.close();        }    }    /**     * 編譯Java文件     *      * @param javaFile     *            Java文件     * @return     * @throws IOException     * @throws InterruptedException     */    private boolean compile(String javaFile) throws IOException,            InterruptedException {        // 調用系統javac命令        Process p = Runtime.getRuntime().exec("javac " + javaFile);        // 強制其他線程等待這個線程完成        p.waitFor();        // 獲取javac線程的退出值        int rtn = p.exitValue();        // 返回編譯是否成功        return rtn == 0;    }            /**     * 重寫ClassLoader的findClass類     */    @Override    protected Class<?> findClass(String name) throws ClassNotFoundException{                Class<?> clazz = null;                String javaPath = name.replace(".", "/");        String javaFileName = javaPath + ".java";        String classFileName = javaPath = ".class";                File javaFile = new File(javaFileName);        File classFile = new File(classFileName);                if(javaFile.exists() && (!classFile.exists() || javaFile.lastModified()>classFile.lastModified())){            try{                if(!compile(javaFileName) || !classFile.exists()){                    throw new ClassNotFoundException("Class not found : " + javaFileName);                }            }catch(Exception e){                e.printStackTrace();            }        }                if(classFile.exists()){            try{                byte[] raw = getBytes(classFileName);                clazz = defineClass(name, raw, 0, raw.length);            }catch(Exception e){                e.printStackTrace();            }        }                if(null==clazz){            throw new ClassNotFoundException(name);        }                return clazz;    }        public static void main(String[] args) throws Exception{        String javaName = "com.zhyea.test.MyTest";        MyClassLoader mcl = new MyClassLoader();        Class<?> clazz = mcl.loadClass(javaName);        Method main = clazz.getMethod("main", (new String[0]).getClass());        Object[] arrs = {args};         main.invoke(null, arrs);    }    }

再附上演示用的測試類,其實很簡單了:

package com.zhyea.test;/** * 自定義類加載器演示用的測試類 * @author robin * */public class MyTest {    public static void main(String[] args) {        System.out.println("This is a Test!");    }}

使用自定義的類加載器,可以實現如下功能:

  • 執行代碼前自動檢驗數字簽名;
  • 根據用戶提供的密碼解密代碼,從而可以實現代碼混淆器避免反編譯class文件;
  • 根據用戶需求來動態地加載類;
  • 根據應用需求把其他數據以字節碼的形式加載到應用中。
URLClassLoader類

URLClassLoader是擴展類加載器類和系統類加載器類的父類。URLClassLoader功能比較強大,可以從本地獲取java文件來加載類,也可獲取遠程文件來加載類。

演示下:

package com.zhyea.test;import java.net.URL;import java.net.URLClassLoader;public class UCLTest {    public static void main(String[] args) throws Exception {        URL[] urls = {new URL("file:com.zhyea.test.MyTest.java")};        URLClassLoader ucl = new URLClassLoader(urls);        MyTest mt = (MyTest) ucl.loadClass("com.zhyea.test.MyTest").newInstance();        mt.test();        ucl.close();    }}package com.zhyea.test;/** * URLClassLoader演示用的測試類 * @author robin * */public class MyTest {    public void test(){        System.out.println("This is a Test 2!");    }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品美女久久久久久免费| 久久天天躁狠狠躁夜夜躁| 国产欧美一区二区三区在线看| 亚洲一区二区在线播放| 国产精品福利网站| 国产精品v片在线观看不卡| 国产成人拍精品视频午夜网站| 精品久久久久久亚洲国产300| 伊人伊成久久人综合网站| 日韩亚洲一区二区| 国产精品99蜜臀久久不卡二区| 黄色精品在线看| 久久视频在线免费观看| 欧美日韩国产丝袜另类| 国产主播欧美精品| 日韩在线欧美在线国产在线| 欧美国产日韩xxxxx| 欧美洲成人男女午夜视频| 久久99精品视频一区97| 亚洲一区二区三区香蕉| 欧美激情网友自拍| 国产精品成人免费电影| 亚洲一区二区久久久久久| 亚洲香蕉成人av网站在线观看| 日韩欧美中文在线| 久久久噜久噜久久综合| 国产精品日韩欧美综合| 国产中文欧美精品| 亚洲美女动态图120秒| 国产视频在线观看一区二区| 欧美日韩美女在线| 欧美孕妇毛茸茸xxxx| 97精品国产97久久久久久免费| 日韩一区二区福利| 日本老师69xxx| 久久久久久香蕉网| 日本亚洲欧洲色| 欧美最猛性xxxxx亚洲精品| 亚洲性生活视频在线观看| 日本精品久久中文字幕佐佐木| 亚洲人成在线观看| 91免费精品国偷自产在线| 欧美丝袜第一区| 日韩av影片在线观看| 日韩亚洲第一页| 国产精品视频精品视频| 97超级碰碰人国产在线观看| 美女福利视频一区| 欧美多人乱p欧美4p久久| 日韩激情视频在线播放| 久久影院中文字幕| 国产在线一区二区三区| 久久久久久久色| 日韩高清电影好看的电视剧电影| 色yeye香蕉凹凸一区二区av| 欧美国产精品日韩| 午夜精品一区二区三区在线视| 日韩免费电影在线观看| 精品国产一区二区三区久久久| 97超级碰碰人国产在线观看| 亚洲香蕉成人av网站在线观看| 国产高清在线不卡| 一区二区亚洲精品国产| 国产视频精品一区二区三区| 欧美午夜影院在线视频| 国产亚洲精品久久久久久777| 97国产精品免费视频| 欧美成人精品在线播放| 丝袜亚洲欧美日韩综合| 全色精品综合影院| 久久久久一本一区二区青青蜜月| 亚洲日本中文字幕| 亚洲福利影片在线| 91精品视频在线免费观看| 亚洲一区999| 亚洲欧美国产日韩中文字幕| 亚洲欧美在线看| 欧美孕妇孕交黑巨大网站| 中文字幕国产亚洲| 欧美精品成人91久久久久久久| 亚洲精品综合精品自拍| 日韩一区视频在线| 久久99国产精品久久久久久久久| 91色视频在线导航| 最新的欧美黄色| 成人在线播放av| 国产成人精品视频在线观看| 成人国内精品久久久久一区| 亚洲视频999| 97香蕉超级碰碰久久免费的优势| 国产精品青草久久久久福利99| 国产精品678| 91av在线播放视频| 97国产suv精品一区二区62| 欧美成人全部免费| 精品久久香蕉国产线看观看亚洲| 久热精品视频在线观看一区| 5566成人精品视频免费| 国产精品久久久| 久久精品免费播放| 久久精品视频播放| 91成人国产在线观看| 久久不射热爱视频精品| 51色欧美片视频在线观看| 成人免费大片黄在线播放| 亚洲色图欧美制服丝袜另类第一页| 欧美精品videos| 久久精品国产2020观看福利| 午夜精品在线视频| 国产成人精品日本亚洲| 久久精品国产精品| 久久精品国产久精国产一老狼| 8x海外华人永久免费日韩内陆视频| 国产精品专区h在线观看| 国产97在线|日韩| 国产精品xxx视频| 中文字幕亚洲综合久久筱田步美| 韩国日本不卡在线| 国产欧美日韩中文字幕在线| 亚洲国产成人久久| 亚洲一区二区中文字幕| 国产色综合天天综合网| 国产精品va在线播放我和闺蜜| 日韩精品视频在线| 欧洲美女免费图片一区| 欧美老少配视频| 亚洲理论在线a中文字幕| 亚洲成年人在线播放| 欧美国产精品人人做人人爱| 国产欧美精品在线| 海角国产乱辈乱精品视频| 欧美成人午夜激情| 国产精品免费福利| 欧美日韩精品二区| 国产视频精品免费播放| 亚洲精品视频播放| 亚洲国产精品yw在线观看| 国产日韩av高清| 国外成人免费在线播放| 久久久久久久亚洲精品| 欧美成人h版在线观看| 北条麻妃99精品青青久久| 欧美日韩国产色| 久久国产精品电影| 欧美视频不卡中文| 尤物精品国产第一福利三区| 国产亚洲欧美视频| 国产日本欧美在线观看| 精品国产老师黑色丝袜高跟鞋| 91精品国产色综合| 97在线视频精品| 亚洲一区美女视频在线观看免费| 欧美视频在线观看免费网址| 欧美激情亚洲综合一区| 欧美片一区二区三区| www.欧美三级电影.com| 欧美在线播放视频| 青草青草久热精品视频在线观看| 国产精品老女人精品视频| 热久久这里只有| 中文字幕日韩视频| 日本久久久久久久久久久| 国产精品免费久久久久久| 亚洲国产日韩一区|