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

