日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java类加载文章1(z)

發(fā)布時(shí)間:2025/5/22 java 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java类加载文章1(z) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. JAVA類裝載器在裝載類的時(shí)候是按需加載的,只有當(dāng)一個(gè)類要使用(使用new 關(guān)鍵字來(lái)實(shí)例化一個(gè)類)的時(shí)候,類加載器才會(huì)加載這??? 個(gè)類并初始化。
??? 類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] (類裝載器會(huì)首先加載rt.jar加載基礎(chǔ)類)
    ??? .
    ??? .
    ??? [Loaded Main from file:/E:/DEV/] (類裝載器載入相應(yīng)類并初始化)
    ??? [Loaded A from file:/E:/DEV/]
    ??? Using Class A
    ??? [Loaded B from file:/E:/DEV/]
    ??? Using Class B
    2. 讓JAVA程序具有動(dòng)態(tài)性
    ?? 使用顯式方式來(lái)實(shí)現(xiàn)動(dòng)態(tài)性,我們需要自己動(dòng)手處理類載入時(shí)的細(xì)節(jié)部分。

    ???? 兩種方法:
    ??? |
    ??? +-- 隱式的 : 使用new關(guān)鍵字讓類加載器按需求載入所需的類
    ??? |
    ??? +-- 顯式的 :
    ??? ??????? ?? |
    ??? ??? ???????????? +-- 由 java.lang.Class的forName()方法加載
    ??? ??? ???????????? |
    ??? ??? ??? ?? +-- 由 java.lang.ClassLoader的loadClass()方法加載

    ??? (1) 使用Class.forName()
    ??? Class.forName()方法具有兩個(gè)重載的方法:
    ??? ??????? +- public static Class forName(String className)
    ??? ??????? |
    ??? ??????? +- public static Class forName(String className, boolean initialize,ClassLoader loader)
    ??? 參數(shù)說(shuō)明:
    ??? ??? className - 所需類的完全限定名
    ??? ??? initialize - 是否必須初始化類(靜態(tài)代碼塊的初始化)
    ??? ??? loader - 用于加載類的類加載器
    調(diào)用只有一個(gè)參數(shù)的forName()方法等效于 Class.forName(className, true, loader)。
    這兩個(gè)方法,最后都要連接到原生方法forName0(),其定義如下:
    private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
    只有一個(gè)參數(shù)的forName()方法,最后調(diào)用的是:
    forName0(className, true, ClassLoader.getCallerClassLoader());
    而三個(gè)參數(shù)的forName(),最后調(diào)用的是:
    forName0(name, initialize, loader);
    所以,不管使用的是new 來(lái)實(shí)例化某個(gè)類、或是使用只有一個(gè)參數(shù)的Class.forName()方法,內(nèi)部都隱含了“載入類 + 運(yùn)行靜態(tài)代碼塊”的步驟。而使用具有三個(gè)參數(shù)的Class.forName()方法時(shí),如果第二個(gè)參數(shù)為false,那么類加載器只會(huì)加載類,而不會(huì)初始化靜態(tài)代碼塊,只有當(dāng)實(shí)例化這個(gè)類的時(shí)候,靜態(tài)代碼塊才會(huì)被初始化,靜態(tài)代碼塊是在類第一次實(shí)例化的時(shí)候才初始化的。

    ??? (2) 直接使用類加載器
    ??? ?? +— 獲得對(duì)象所屬的類 : getClass()方法
    ??? ?????? |
    ??? ?????? +— 獲得該類的類加載器 : getClassLoader()方法
    java 代碼
  • public class Main3 {??
  • ????public static void main(String[] args) throws Exception {??
  • ???????? Main3 main3 = new Main3();??
  • ???????? System.out.println("準(zhǔn)備載入類");??
  • ???????? ClassLoader loader = main3.getClass().getClassLoader();??
  • ???????? Class clazzA = loader.loadClass(args[0]);??
  • ???????? System.out.println("實(shí)例化類A");??
  • ???????? A o1 = (A) clazzA.newInstance();??????????
  • ???? }??
  • }??

  • 3 類加載器的層次

    轉(zhuǎn)載于:https://www.cnblogs.com/macula7/archive/2010/01/20/1960543.html

    總結(jié)

    以上是生活随笔為你收集整理的Java类加载文章1(z)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。