欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 編程如何使用 Class.forName() 加載類(lèi)

 更新時(shí)間:2024年04月30日 09:56:46   作者:sunzn  
在一些應(yīng)用中,無(wú)法事先知道使用者將加載什么類(lèi),而必須讓使用者指定類(lèi)名稱(chēng)以加載類(lèi),可以使用 Class的靜態(tài)forName()方法實(shí)現(xiàn)動(dòng)態(tài)加載類(lèi),這篇文章主要介紹了Java編程如何使用Class.forName()加載類(lèi),需要的朋友可以參考下

Java 編程下使用 Class.forName() 加載類(lèi)

在一些應(yīng)用中,無(wú)法事先知道使用者將加載什么類(lèi),而必須讓使用者指定類(lèi)名稱(chēng)以加載類(lèi),可以使用 Class 的靜態(tài) forName() 方法實(shí)現(xiàn)動(dòng)態(tài)加載類(lèi)。下面的范例讓你可以指定類(lèi)名稱(chēng)來(lái)獲得類(lèi)的相關(guān)信息。

package cn.sunzn.demo;
public class ClassDemo {
    public static void main(String[] args) {
        try {
            Class c = Class.forName(args[0]);
            System.out.println("類(lèi)名稱(chēng):" + c.getName());
            System.out.println("是否為接口:" + c.isInterface());
            System.out.println("是否為基本類(lèi)型:" + c.isPrimitive());
            System.out.println("是否為數(shù)組:" + c.isArray());
            System.out.println("父類(lèi):" + c.getSuperclass().getName());
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("沒(méi)有指定類(lèi)名稱(chēng)");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到指定的類(lèi)");
        }
    }
}

在指定類(lèi)給 forName() 方法后,如果找不到指定的類(lèi),會(huì)拋出 ClassNotFoundException 異常。Class 的靜態(tài) forName() 方法有兩個(gè)版本,上面的代碼是只指定類(lèi)名稱(chēng)的版本,而另一個(gè)版本可以讓你指定類(lèi)名稱(chēng)、加載時(shí)是否運(yùn)行靜態(tài)區(qū)塊、指定類(lèi)加載器:

Static Class forName(String name, boolean initialize, ClassLoader loader)

默認(rèn)在加載類(lèi)的時(shí)候,如果類(lèi)中有定義靜態(tài)區(qū)塊則會(huì)運(yùn)行它。你可以使用 forName() 的第二個(gè)版本,將 initialize 設(shè)定為 false,這樣在加載類(lèi)時(shí)并不會(huì)立即運(yùn)行靜態(tài)區(qū)塊,而會(huì)在使用類(lèi)建立對(duì)象時(shí)才運(yùn)行靜態(tài)區(qū)塊。為了印證,可以先設(shè)計(jì)一個(gè)測(cè)試類(lèi)。

測(cè)試類(lèi):TestClass 
package cn.sunzn.demo;
public class TestClass {
    static {
        System.out.println("[運(yùn)行靜態(tài)區(qū)塊]");
    }
}

在測(cè)試類(lèi) TestClass 中只定義了靜態(tài)區(qū)塊顯示一段信息,以觀察靜態(tài)區(qū)塊何時(shí)被運(yùn)行??梢栽O(shè)計(jì)范例 ForNameDemo1 使用第一個(gè)版本的 forName() 方法。

測(cè)試類(lèi):ForNameDemo1
package cn.sunzn.demo;
public class ForNameDemo1 {
    public static void main(String[] args) {
        try {
            System.out.println("載入 TestClass ");
            Class c = Class.forName("cn.sunzn.demo.TestClass");
            System.out.println("使用 TestClass 聲明參考名稱(chēng)");
            TestClass test = null;
            System.out.println("使用 TestClass 建立對(duì)象");
            test = new TestClass();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("沒(méi)有指定類(lèi)名稱(chēng)");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到指定的類(lèi)");
        }
    }
}

運(yùn)行結(jié)果如下:

載入 TestClass 
[運(yùn)行靜態(tài)區(qū)塊]
使用 TestClass 聲明參考名稱(chēng)
使用 TestClass 建立對(duì)象

從運(yùn)行結(jié)果中可以看到,第一版本的 forName() 方法在類(lèi)加載之后,默認(rèn)會(huì)立即運(yùn)行靜態(tài)代碼塊。下面來(lái)看范例 ForNameDemo2 中使用第二個(gè)版本的 forName() 方法會(huì)是如何。

測(cè)試類(lèi):ForNameDemo2
package cn.sunzn.demo;
public class ForNameDemo2 {
    public static void main(String[] args) {
        try {
            System.out.println("載入 TestClass ");
            Class c = Class.forName("cn.sunzn.demo.TestClass", false, Thread.currentThread().getContextClassLoader());
            System.out.println("使用 TestClass 聲明參考名稱(chēng)");
            TestClass test = null;
            System.out.println("使用 TestClass 建立對(duì)象");
            test = new TestClass();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("沒(méi)有指定類(lèi)名稱(chēng)");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到指定的類(lèi)");
        }
    }
}

運(yùn)行結(jié)果如下:

載入 TestClass 
使用 TestClass 聲明參考名稱(chēng)
使用 TestClass 建立對(duì)象
[運(yùn)行靜態(tài)區(qū)塊]

由于使用第二個(gè)版本的 forName() 方法時(shí),設(shè)定 initialize 為 false,所以加載類(lèi)時(shí)并不會(huì)立即運(yùn)行靜態(tài)區(qū)塊,而會(huì)在使用類(lèi)建立對(duì)象時(shí)才運(yùn)行靜態(tài)區(qū)塊,第二個(gè)版本的 forName() 方法會(huì)需要一個(gè)類(lèi)加載器,范例中所使用的是主線(xiàn)程的類(lèi)加載器。

到此這篇關(guān)于Java 編程如何使用 Class.forName() 加載類(lèi)的文章就介紹到這了,更多相關(guān)Java Class.forName() 加載類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中this的用法示例(關(guān)鍵字this)

    java中this的用法示例(關(guān)鍵字this)

    這篇文章主要介紹了java中this的用法示例(關(guān)鍵字this),需要的朋友可以參考下
    2014-03-03
  • SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹

    SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹

    Ribbon是Netflix的組件之一,負(fù)責(zé)注冊(cè)中心的負(fù)載均衡,有助于控制HTTP和TCP客戶(hù)端行為。Spring Cloud Netflix Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載
    2022-12-12
  • Java實(shí)現(xiàn)聊天機(jī)器人完善版

    Java實(shí)現(xiàn)聊天機(jī)器人完善版

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)聊天機(jī)器人完善版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java中Object類(lèi)的理解和使用

    Java中Object類(lèi)的理解和使用

    Object類(lèi)是java.lang包下的核心類(lèi),Object類(lèi)是所有類(lèi)的父類(lèi),何一個(gè)類(lèi)時(shí)候如果沒(méi)有明確的繼承一個(gè)父類(lèi)的話(huà),那么它就是Object的子類(lèi),本文將通過(guò)代碼示例詳細(xì)介紹一下Java中Object類(lèi)的理解和使用,需要的朋友可以參考下
    2023-06-06
  • Zookeeper實(shí)現(xiàn)分布式鎖代碼實(shí)例

    Zookeeper實(shí)現(xiàn)分布式鎖代碼實(shí)例

    這篇文章主要介紹了Zookeeper實(shí)現(xiàn)分布式鎖代碼實(shí)例,Zookeeper?分布式鎖應(yīng)用了其?臨時(shí)順序節(jié)點(diǎn)?的特性,在Zookeeper中創(chuàng)建一個(gè)持久節(jié)點(diǎn)ParentLock,當(dāng)?shù)谝粋€(gè)客戶(hù)端要獲取鎖時(shí),在ParentLock節(jié)點(diǎn)下創(chuàng)建一個(gè)臨時(shí)順序節(jié)點(diǎn),需要的朋友可以參考下
    2023-12-12
  • Component和Configuration注解區(qū)別實(shí)例詳解

    Component和Configuration注解區(qū)別實(shí)例詳解

    這篇文章主要為大家介紹了Component和Configuration注解區(qū)別實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java算法中的歸并排序算法代碼實(shí)現(xiàn)

    Java算法中的歸并排序算法代碼實(shí)現(xiàn)

    這篇文章主要介紹了Java算法中的歸并排序算法代碼實(shí)現(xiàn),歸并排序使用的是分治思想(Divide and Conquer),分治,顧名思義,就是分而治之,是將一個(gè)大問(wèn)題分解成小的子問(wèn)題來(lái)解決,需要的朋友可以參考下
    2023-12-12
  • 基于JavaSwing+mysql開(kāi)發(fā)一個(gè)學(xué)生社團(tuán)管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)

    基于JavaSwing+mysql開(kāi)發(fā)一個(gè)學(xué)生社團(tuán)管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)

    項(xiàng)目使用Java swing+mysql開(kāi)發(fā),可實(shí)現(xiàn)基礎(chǔ)數(shù)據(jù)維護(hù)、用戶(hù)登錄注冊(cè)、社團(tuán)信息列表查看、社團(tuán)信息添加、社團(tuán)信息修改、社團(tuán)信息刪除以及退出注銷(xiāo)等功能、界面設(shè)計(jì)比較簡(jiǎn)單易學(xué)、適合作為Java課設(shè)設(shè)計(jì)以及學(xué)習(xí)技術(shù)使用,需要的朋友參考下吧
    2021-08-08
  • Spring Security 安全認(rèn)證的示例代碼

    Spring Security 安全認(rèn)證的示例代碼

    這篇文章主要介紹了Spring Security 安全認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過(guò)程

    Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過(guò)程

    這篇文章主要為大家介紹了Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-02-02

最新評(píng)論