Class.forName()詳細
Class.forName(xxx.x.xx)はクラスを返します.新Instance()の後にオブジェクトClassが作成されます.forName(xxx.xx.xx);JVMが指定するクラスを検索してロードすること、すなわちJVMがそのクラスの静的コードセグメントClass a anInstance=aClassを実行することが要求される.newInstance();-------------------------------Class.forName("").新Instance()はobjectbut there is some limit for this method to createinstancethat is your class constructor should no contain parameters,andyou should cast the instance manually.--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------使用時:Class.forName("MyDriver");Driver d=Driver.getDriver();-------------------------------あるjdbc接続データベースの書き方はClassです.forName(xxx.xx.xx);いくつかありますforName(xxx.xx.xx).newInstance()、なぜこの2つの書き方があるのでしょうか?Class.forName(xxx.x.xx)はクラスを返します.新Instance()の後にオブジェクトClassが作成されます.forName(xxx.xx.xx);JVMが指定したクラスを検索してロードする必要があります.つまり、JVMがクラスを実行する静的コードセグメントは、JDBC仕様で、このDriverクラスがDriverManagerに自分自身を登録する必要があることを明確にしています.つまり、JDBC DriverのDriverクラスのコードは次のようにしなければなりません.
だからJDBCを使うときはClassだけが必要です.forName(XXX.XXX);それでいいんだforName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same ascalling Class.forName(xxx.xx.xx), becauseClass.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をメモリに呼び出し、オブジェクトをインスタンス化するのは意味がありません.
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);いくつかありますforName(xxx.xx.xx).newInstance()、なぜこの2つの書き方があるのでしょうか?Class.forName(xxx.x.xx)はクラスを返します.新Instance()の後にオブジェクトClassが作成されます.forName(xxx.xx.xx);JVMが指定したクラスを検索してロードする必要があります.つまり、JVMがクラスを実行する静的コードセグメントは、JDBC仕様で、このDriverクラスがDriverManagerに自分自身を登録する必要があることを明確にしています.つまり、JDBC DriverのDriverクラスのコードは次のようにしなければなりません.
public classMyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
だからJDBCを使うときはClassだけが必要です.forName(XXX.XXX);それでいいんだforName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same ascalling Class.forName(xxx.xx.xx), becauseClass.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をメモリに呼び出し、オブジェクトをインスタンス化するのは意味がありません.