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

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調入到內存中,再實例化對象是沒有意義的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章