Java类加载文章1(z)
生活随笔
收集整理的這篇文章主要介紹了
Java类加载文章1(z)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. JAVA類裝載器在裝載類的時候是按需加載的,只有當一個類要使用(使用new 關鍵字來實例化一個類)的時候,類加載器才會加載這??? 個類并初始化。
??? 類Main:
??? java 代碼public class Main {?? ????public static void main(String[] args) {?? ???????? A a = new A();?? ???????? a.print();?? ???????? B b = new B();?? ???????? b.print();?? ???? }?? }?? ??
類A:
java 代碼public class A?? {?? ????public void print() {?? ???????? System.out.println("Using Class A");?? ???? }?? }??
類B:
java 代碼public class B {?? ????public void print() {?? ???????? System.out.println("Using Class B");?? ???? }?? }??
執(zhí)行:java -varbose:class Main
執(zhí)行結(jié)果:
??? E:\DEV>java -verbose:class Main
??? [Opened C:\Program Files\Java\jre1.5.0_11\lib\rt.jar] (類裝載器會首先加載rt.jar加載基礎類)
??? .
??? .
??? [Loaded Main from file:/E:/DEV/] (類裝載器載入相應類并初始化)
??? [Loaded A from file:/E:/DEV/]
??? Using Class A
??? [Loaded B from file:/E:/DEV/]
??? Using Class B
2. 讓JAVA程序具有動態(tài)性
?? 使用顯式方式來實現(xiàn)動態(tài)性,我們需要自己動手處理類載入時的細節(jié)部分。
???? 兩種方法:
??? |
??? +-- 隱式的 : 使用new關鍵字讓類加載器按需求載入所需的類
??? |
??? +-- 顯式的 :
??? ??????? ?? |
??? ??? ???????????? +-- 由 java.lang.Class的forName()方法加載
??? ??? ???????????? |
??? ??? ??? ?? +-- 由 java.lang.ClassLoader的loadClass()方法加載
??? (1) 使用Class.forName()
??? Class.forName()方法具有兩個重載的方法:
??? ??????? +- public static Class forName(String className)
??? ??????? |
??? ??????? +- public static Class forName(String className, boolean initialize,ClassLoader loader)
??? 參數(shù)說明:
??? ??? className - 所需類的完全限定名
??? ??? initialize - 是否必須初始化類(靜態(tài)代碼塊的初始化)
??? ??? loader - 用于加載類的類加載器
調(diào)用只有一個參數(shù)的forName()方法等效于 Class.forName(className, true, loader)。
這兩個方法,最后都要連接到原生方法forName0(),其定義如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一個參數(shù)的forName()方法,最后調(diào)用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三個參數(shù)的forName(),最后調(diào)用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來實例化某個類、或是使用只有一個參數(shù)的Class.forName()方法,內(nèi)部都隱含了“載入類 + 運行靜態(tài)代碼塊”的步驟。而使用具有三個參數(shù)的Class.forName()方法時,如果第二個參數(shù)為false,那么類加載器只會加載類,而不會初始化靜態(tài)代碼塊,只有當實例化這個類的時候,靜態(tài)代碼塊才會被初始化,靜態(tài)代碼塊是在類第一次實例化的時候才初始化的。
??? (2) 直接使用類加載器
??? ?? +— 獲得對象所屬的類 : getClass()方法
??? ?????? |
??? ?????? +— 獲得該類的類加載器 : getClassLoader()方法
java 代碼public class Main3 {?? ????public static void main(String[] args) throws Exception {?? ???????? Main3 main3 = new Main3();?? ???????? System.out.println("準備載入類");?? ???????? ClassLoader loader = main3.getClass().getClassLoader();?? ???????? Class clazzA = loader.loadClass(args[0]);?? ???????? System.out.println("實例化類A");?? ???????? A o1 = (A) clazzA.newInstance();?????????? ???? }?? }??
3 類加載器的層次
??? 類Main:
??? java 代碼
類A:
java 代碼
類B:
java 代碼
執(zhí)行:java -varbose:class Main
執(zhí)行結(jié)果:
??? E:\DEV>java -verbose:class Main
??? [Opened C:\Program Files\Java\jre1.5.0_11\lib\rt.jar] (類裝載器會首先加載rt.jar加載基礎類)
??? .
??? .
??? [Loaded Main from file:/E:/DEV/] (類裝載器載入相應類并初始化)
??? [Loaded A from file:/E:/DEV/]
??? Using Class A
??? [Loaded B from file:/E:/DEV/]
??? Using Class B
2. 讓JAVA程序具有動態(tài)性
?? 使用顯式方式來實現(xiàn)動態(tài)性,我們需要自己動手處理類載入時的細節(jié)部分。
???? 兩種方法:
??? |
??? +-- 隱式的 : 使用new關鍵字讓類加載器按需求載入所需的類
??? |
??? +-- 顯式的 :
??? ??????? ?? |
??? ??? ???????????? +-- 由 java.lang.Class的forName()方法加載
??? ??? ???????????? |
??? ??? ??? ?? +-- 由 java.lang.ClassLoader的loadClass()方法加載
??? (1) 使用Class.forName()
??? Class.forName()方法具有兩個重載的方法:
??? ??????? +- public static Class forName(String className)
??? ??????? |
??? ??????? +- public static Class forName(String className, boolean initialize,ClassLoader loader)
??? 參數(shù)說明:
??? ??? className - 所需類的完全限定名
??? ??? initialize - 是否必須初始化類(靜態(tài)代碼塊的初始化)
??? ??? loader - 用于加載類的類加載器
調(diào)用只有一個參數(shù)的forName()方法等效于 Class.forName(className, true, loader)。
這兩個方法,最后都要連接到原生方法forName0(),其定義如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一個參數(shù)的forName()方法,最后調(diào)用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三個參數(shù)的forName(),最后調(diào)用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來實例化某個類、或是使用只有一個參數(shù)的Class.forName()方法,內(nèi)部都隱含了“載入類 + 運行靜態(tài)代碼塊”的步驟。而使用具有三個參數(shù)的Class.forName()方法時,如果第二個參數(shù)為false,那么類加載器只會加載類,而不會初始化靜態(tài)代碼塊,只有當實例化這個類的時候,靜態(tài)代碼塊才會被初始化,靜態(tài)代碼塊是在類第一次實例化的時候才初始化的。
??? (2) 直接使用類加載器
??? ?? +— 獲得對象所屬的類 : getClass()方法
??? ?????? |
??? ?????? +— 獲得該類的類加載器 : getClassLoader()方法
java 代碼
3 類加載器的層次
轉(zhuǎn)載于:https://www.cnblogs.com/macula7/archive/2010/01/20/1960543.html
總結(jié)
以上是生活随笔為你收集整理的Java类加载文章1(z)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启用Visual Studio 对jQu
- 下一篇: PatBlt - [Daliy APIs