1. 程式人生 > >關於反射中Class.forName

關於反射中Class.forName

問題出處:

   模板方法中

   public static Human createHuman(Class c){

    Human human= null ;  // 定義一個型別的人類 
    try {    

human = (Human)Class. forName (c.getName()).newInstance();   // 產生一個 人類 
        } catch (Exception e) {  
       System. out .println( "必須指定人類的顏色");   

   }

return human;

           }

解釋 1. c.getName() 列印的值是類的完全限定名,即包名+類名

          2.Class. forName (c.getName()).newInstance(); 作用是建立c.getName()這個類的例項

  3.newInstance() 和new 的區別

    eg:::::      A a = (A)Class.forName("package.A").newInstance();

            A a = new A();

                    String className = "Example";

                            Class c = c.Class. forName(className );

                     c.newInstance();

                  區別I      newInstance() 弱型別,低效率,只能呼叫無參建構函式

                         new  強型別,相對高效,能呼叫任何public建構函式

                         II      從jvm角度看,我們使用關鍵字new建立一個新類的時候,這個類可以沒有被載入;但是使用newInstance()的時候,這個類已經載入,這個類已經連線,完成這兩個操作正是Class靜態方法forName()所做的;現在可以看出newInstance()實際上是把new分成了兩步,即首先呼叫類載入器載入某個類,然後例項化。這樣分步也有個好處就是可以降耦,比如你要反射例項化的類繼承了某個基類B b = (A)Class.forName("package.A").newInstance(); B繼承了A 這樣就降耦了。