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


在一些應用中,無法事先知道使用者將加載什么類,而必須讓使用者指定類名稱以加載類,可以使用 Class 的靜態 forName() 方法實現動態加載類。下面的范例讓你可以指定類名稱來獲得類的相關信息。

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("是否為數組:" + c.isArray());
            System.out.println("父類:" + c.getSuperclass().getName());
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("沒有指定類名稱");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到指定的類");
        }
    }
}

在指定類給 forName() 方法后,如果找不到指定的類,會拋出 ClassNotFoundException 異常。Class 的靜態 forName() 方法有兩個版本,上面的代碼是只指定類名稱的版本,而另一個版本可以讓你指定類名稱、加載時是否運行靜態區塊、指定類加載器:

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

默認在加載類的時候,如果類中有定義靜態區塊則會運行它。你可以使用 forName() 的第二個版本,將 initialize 設定為 false,這樣在加載類時並不會立即運行靜態區塊,而會在使用類建立對象時才運行靜態區塊。為了印證,可以先設計一個測試類。

測試類:TestClass 

package
cn.sunzn.demo; public class TestClass { static { System.out.println("[運行靜態區塊]"); } }

在測試類 TestClass 中只定義了靜態區塊顯示一段信息,以觀察靜態區塊何時被運行。可以設計范例 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 
[運行靜態區塊]
使用 TestClass 聲明參考名稱
使用 TestClass 建立對象

從運行結果中可以看到,第一版本的 forName() 方法在類加載之后,默認會立即運行靜態代碼塊。下面來看范例 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 建立對象
[運行靜態區塊]

由於使用第二個版本的 forName() 方法時,設定 initialize 為 false,所以加載類時並不會立即運行靜態區塊,而會在使用類建立對象時才運行靜態區塊,第二個版本的 forName() 方法會需要一個類加載器,范例中所使用的是主線程的類加載器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM