Java 編程如何使用 Class.forName() 加載類
Java 編程下使用 Class.forName() 加載類
在一些應用中,無法事先知道使用者將加載什么類,而必須讓使用者指定類名稱以加載類,可以使用 Class 的靜態(tài) forName() 方法實現(xiàn)動態(tài)加載類。下面的范例讓你可以指定類名稱來獲得類的相關信息。
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() 方法有兩個版本,上面的代碼是只指定類名稱的版本,而另一個版本可以讓你指定類名稱、加載時是否運行靜態(tài)區(qū)塊、指定類加載器:
Static Class forName(String name, boolean initialize, ClassLoader loader)
默認在加載類的時候,如果類中有定義靜態(tài)區(qū)塊則會運行它。你可以使用 forName() 的第二個版本,將 initialize 設定為 false,這樣在加載類時并不會立即運行靜態(tài)區(qū)塊,而會在使用類建立對象時才運行靜態(tài)區(qū)塊。為了印證,可以先設計一個測試類。
測試類:TestClass package cn.sunzn.demo; public class TestClass { static { System.out.println("[運行靜態(tài)區(qū)塊]"); } }
在測試類 TestClass 中只定義了靜態(tài)區(qū)塊顯示一段信息,以觀察靜態(tài)區(qū)塊何時被運行??梢栽O計范例 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("找不到指定的類"); } } }
運行結果如下:
載入 TestClass
[運行靜態(tài)區(qū)塊]
使用 TestClass 聲明參考名稱
使用 TestClass 建立對象
從運行結果中可以看到,第一版本的 forName() 方法在類加載之后,默認會立即運行靜態(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("找不到指定的類"); } } }
運行結果如下:
載入 TestClass
使用 TestClass 聲明參考名稱
使用 TestClass 建立對象
[運行靜態(tài)區(qū)塊]
由于使用第二個版本的 forName() 方法時,設定 initialize 為 false,所以加載類時并不會立即運行靜態(tài)區(qū)塊,而會在使用類建立對象時才運行靜態(tài)區(qū)塊,第二個版本的 forName() 方法會需要一個類加載器,范例中所使用的是主線程的類加載器。
到此這篇關于Java 編程如何使用 Class.forName() 加載類的文章就介紹到這了,更多相關Java Class.forName() 加載類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringCloud Netfilx Ribbon負載均衡工具使用方法介紹
Ribbon是Netflix的組件之一,負責注冊中心的負載均衡,有助于控制HTTP和TCP客戶端行為。Spring Cloud Netflix Ribbon一般配合Ribbon進行使用,利用在Eureka中讀取的服務信息,在調用服務節(jié)點時合理進行負載2022-12-12Component和Configuration注解區(qū)別實例詳解
這篇文章主要為大家介紹了Component和Configuration注解區(qū)別實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11基于JavaSwing+mysql開發(fā)一個學生社團管理系統(tǒng)設計和實現(xiàn)
項目使用Java swing+mysql開發(fā),可實現(xiàn)基礎數(shù)據(jù)維護、用戶登錄注冊、社團信息列表查看、社團信息添加、社團信息修改、社團信息刪除以及退出注銷等功能、界面設計比較簡單易學、適合作為Java課設設計以及學習技術使用,需要的朋友參考下吧2021-08-08Spring?Boot在Web應用中基于JdbcRealm安全驗證過程
這篇文章主要為大家介紹了Spring?Boot在Web應用中基于JdbcRealm安全驗證過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-02-02