Java 編程如何使用 Class.forName() 加載類
Java 編程下使用 Class.forName() 加載類
在一些應(yīng)用中,無法事先知道使用者將加載什么類,而必須讓使用者指定類名稱以加載類,可以使用 Class 的靜態(tài) forName() 方法實(shí)現(xiàn)動(dòng)態(tà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("類名稱:" + c.getName());
System.out.println("是否為接口:" + c.isInterface());
System.out.println("是否為基本類型:" + c.isPrimitive());
System.out.println("是否為數(shù)組:" + c.isArray());
System.out.println("父類:" + c.getSuperclass().getName());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("沒有指定類名稱");
} catch (ClassNotFoundException e) {
System.out.println("找不到指定的類");
}
}
}在指定類給 forName() 方法后,如果找不到指定的類,會(huì)拋出 ClassNotFoundException 異常。Class 的靜態(tài) forName() 方法有兩個(gè)版本,上面的代碼是只指定類名稱的版本,而另一個(gè)版本可以讓你指定類名稱、加載時(shí)是否運(yùn)行靜態(tài)區(qū)塊、指定類加載器:
Static Class forName(String name, boolean initialize, ClassLoader loader)
默認(rèn)在加載類的時(shí)候,如果類中有定義靜態(tài)區(qū)塊則會(huì)運(yùn)行它。你可以使用 forName() 的第二個(gè)版本,將 initialize 設(shè)定為 false,這樣在加載類時(shí)并不會(huì)立即運(yùn)行靜態(tài)區(qū)塊,而會(huì)在使用類建立對(duì)象時(shí)才運(yùn)行靜態(tài)區(qū)塊。為了印證,可以先設(shè)計(jì)一個(gè)測(cè)試類。
測(cè)試類:TestClass
package cn.sunzn.demo;
public class TestClass {
static {
System.out.println("[運(yùn)行靜態(tài)區(qū)塊]");
}
}在測(cè)試類 TestClass 中只定義了靜態(tài)區(qū)塊顯示一段信息,以觀察靜態(tài)區(qū)塊何時(shí)被運(yùn)行??梢栽O(shè)計(jì)范例 ForNameDemo1 使用第一個(gè)版本的 forName() 方法。
測(cè)試類: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 聲明參考名稱");
TestClass test = null;
System.out.println("使用 TestClass 建立對(duì)象");
test = new TestClass();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("沒有指定類名稱");
} catch (ClassNotFoundException e) {
System.out.println("找不到指定的類");
}
}
}運(yùn)行結(jié)果如下:
載入 TestClass
[運(yùn)行靜態(tài)區(qū)塊]
使用 TestClass 聲明參考名稱
使用 TestClass 建立對(duì)象
從運(yùn)行結(jié)果中可以看到,第一版本的 forName() 方法在類加載之后,默認(rèn)會(huì)立即運(yùn)行靜態(tài)代碼塊。下面來看范例 ForNameDemo2 中使用第二個(gè)版本的 forName() 方法會(huì)是如何。
測(cè)試類: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 聲明參考名稱");
TestClass test = null;
System.out.println("使用 TestClass 建立對(duì)象");
test = new TestClass();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("沒有指定類名稱");
} catch (ClassNotFoundException e) {
System.out.println("找不到指定的類");
}
}
}運(yùn)行結(jié)果如下:
載入 TestClass
使用 TestClass 聲明參考名稱
使用 TestClass 建立對(duì)象
[運(yùn)行靜態(tài)區(qū)塊]
由于使用第二個(gè)版本的 forName() 方法時(shí),設(shè)定 initialize 為 false,所以加載類時(shí)并不會(huì)立即運(yùn)行靜態(tài)區(qū)塊,而會(huì)在使用類建立對(duì)象時(shí)才運(yùn)行靜態(tài)區(qū)塊,第二個(gè)版本的 forName() 方法會(huì)需要一個(gè)類加載器,范例中所使用的是主線程的類加載器。
到此這篇關(guān)于Java 編程如何使用 Class.forName() 加載類的文章就介紹到這了,更多相關(guān)Java Class.forName() 加載類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
servlet異步請(qǐng)求的實(shí)現(xiàn)
本文主要介紹了servlet異步請(qǐng)求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Mybatis調(diào)用SQL?Server存儲(chǔ)過程的實(shí)現(xiàn)示例
在軟件開發(fā)過程中,經(jīng)常會(huì)使用到存儲(chǔ)過程,本文就來介紹一下Mybatis調(diào)用SQL?Server存儲(chǔ)過程的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Java中使用標(biāo)簽(label)來控制循環(huán)的執(zhí)行流程
java 和 label 兩個(gè)完全不相干的詞,今天我把他們連接在一起了,試想一個(gè)問題,雙循環(huán)在不使用 return 的情況下,如何停止外循環(huán)?所以本文給大家介紹了Java中使用標(biāo)簽(label)來控制循環(huán)的執(zhí)行流程,需要的朋友可以參考下2024-06-06
SpringBoot整合Minio實(shí)現(xiàn)文件上傳和讀取功能
最近有一個(gè)需求是關(guān)于視頻上傳播放的,需要設(shè)計(jì)一個(gè)方案,中間談到了Minio這個(gè)技術(shù),于是來學(xué)習(xí)一下,所以本文給大家介紹了SpringBoot整合Minio實(shí)現(xiàn)文件上傳和讀取功能,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-07-07

