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)文章
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
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í)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
基于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)證的示例代碼,文中通過(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ò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-02-02

