【JAVA】Class.forName用法以及和new的區別

走在路上的WWB發表於2012-02-11
Class.forName用法以及和new的區別
2007-11-30 0:50

Class.forName是用來獲取Class的類型別
例如:class myclass
{
int Point;
public static void main(String[] args)
{

Class obj=Class.forName(myclass);
System.out.println(obj.getClassName());
//輸出為"myclass";
}
}
用到資料庫就是用來載入驅動。
例如:用sql資料庫建立jdbc-odbc橋
Class.forName("sun.Jdbc.Odbc.JdbcOdbc");
建立連線
Connection=DriverManager.getConnection("jdbc:odbc:ODBC");
ODBC為你建立的ODBC名 

比如:
        Class c =Class.forName("ss.dd.bb.Bean"); Bean b = c.newInstace();
   和 Bean b = new Bean();效果一樣

      但是:forName("ss.bb.bean"), JVM會在classapth中去找對應的類,設定在classpath的類,在java啟動的時候最先被載入,並將Class物件儲存起來,這樣forName建立物件時就不需要通過classloader再去讀取該類的檔案了。而new 一個物件,一般不需要該類在classpath中設定,但可能需要通過classlaoder來載入。
       當你確定此時記憶體中沒有這個物件的時候,你就可以用class.forName();來建立一個物件,而假如new是不管你記憶體中是否有這個物件都會建立一個新的物件,也是說會在記憶體中開闢一個新的記憶體空間!


【用法】

     Class aClass = Class.forName(xxx.xx.xx);
  Object anInstance = aClass.newInstance();
  Class.forName("").newInstance()返回的是object
  but there is some limit for this method to create instance
  that is your class constructor should no contain parameters, and you should cast the instance manually.
  Class Driver{
  protected static Driver current;
  public static Driver getDriver(){
  return current;
  }
  }
  Class MyDriver extends Driver{
  static{
  Driver.current=new MyDriver();
  }
  MyDriver(){}
  }
  用時:
  Class.forName("MyDriver");
  Driver d=Driver.getDriver();
  有的jdbc連線資料庫的寫法裡是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),為什麼會有這兩種寫法呢?
  Class.forName(xxx.xx.xx) 返回的是一個類,
  .newInstance() 後才建立一個物件
  Class.forName(xxx.xx.xx);的作用是要求JVM查詢並載入指定的類,也就是說JVM會執行該類的靜態程式碼段
  在JDBC規範中明確要求這個Driver類必須向DriverManager註冊自己,即任何一個JDBC Driver的Driver類的程式碼都必須類似如下:
  public class MyJDBCDriver implements Driver {
  static {
  DriverManager.registerDriver(new MyJDBCDriver());
  }
  }
  所以我們在使用JDBC時只需要Class.forName(XXX.XXX);就可以了
  we just want to load the driver to jvm only, but not need to user the instance of driver, so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same as calling Class.forName(xxx.xx.xx), because Class.forName(xxx.xx.xx).newInstance() will load driver first, and then create instance, but the instacne you will never use in usual, so you need not to create it.
  在JDBC驅動中,有一塊靜態程式碼,也叫靜態初始化塊,它執行的時間是當class調入到記憶體中就執行(你可以想像成,當類呼叫到記憶體後就執行一個方法)。所以很多人把jdbc driver調入到記憶體中,再例項化物件是沒有意義的

相關文章