8

私のWebサーバーにヒットするように更新すると完全に機能するコードで、この役立つリンクに出くわしました。私は絶対にすべてを行うことができます。

さて、私が完全に理解していないのはClass.forName()

なぜこれが使われているのですか?これは別の方法で行うことができますか?これは他の何かの回避策ですか?参照を追加しますか?別のクラスを実装/拡張するクラスを作成しますか?

何が起こっているのかを完全に理解したいのですが、これは私の邪魔です。

ありがとうございました

4

4 に答える 4

11

そのコードは、MySQLドライバーを表すクラスを強制的にロードして初期化します。Javaでは、クラスをロードする必要がない限り、クラスはロードされません。JDBCコードは通常、ドライバーを直接参照することはないため、Class.forName(または他の同等の代替手段がなければ)ロードされません。

クラスのロード初期化の両方が必要であることに注意してください。これは2つの異なるものです。

また、呼び出す必要はないことに注意してください.newInstance()。ドライバーの静的初期化子は、既にそれ自体をJDBCドライバーとして登録しています。

最後に、Service Loader APIでは、通常、Class.forName()を呼び出してドライバーをロードする必要がないことに注意してください。ドライバーは自動的にロードできます。

于 2012-10-17T11:19:37.190 に答える
7

Class.forName(className)指定されたクラスをロードしますclassName

JDBCドライバーは、特定のJDBCドライバーにコンパイル時の依存関係を持つ必要がないように、この方法でロードされます。考え方は、特定のJDBCドライバーを直接参照することなく、JavaのJDBC API(パッケージjava.sqlおよびで定義されたクラスとインターフェース)を使用することです。javax.sql

Javaに呼び出しでドライバークラスをロードさせるforNameと、ドライバーはそれ自体を登録して使用できるようにします。

ほとんどのJDBCドライバーでは、ドライバークラスの新しいインスタンスを明示的に作成する必要がないことに注意してください。通話を中断することができ.newInstance()ます。

JDBCバージョン4.0以降、Class.forName()呼び出しは不要になっていることに注意してください。ドライバーを検出するプロセスが改善され、JDBCはドライバーを自動的にロードできるようになりました。

于 2012-10-17T11:25:38.557 に答える
5

すべてのJDBCドライバーには、それ自体をDriverManagerに登録する静的ブロックがあり、DriverManagerには静的初期化子のみがあります。

MySQL JDBC Driverには、次のような静的初期化子があります。

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

JVMは静的ブロックを実行し、ドライバーはそれ自体をDriverManagerに登録します。データベースを操作するには、データベース接続が必要です。データベースへの接続を作成するには、DriverManagerクラスが使用するデータベースドライバーを認識している必要があります。これは、登録されているドライバーの配列(内部的にはVector)を反復処理し、配列内の各ドライバーでacceptsURL(url)メソッドを呼び出して、JDBCを処理できるかどうかをドライバーに通知するように効果的に要求します。 URL。

于 2012-10-17T11:25:04.240 に答える
0

たとえば、次のように使用できます。

import com.mysql.jdbc.Driver;

public class MyClass {
   //[...]
   public void myMethod() {
        Class<Driver> clz = Driver.class;
        Driver driver = clz.newInstance();
   }
}

しかし、これはそれほど柔軟ではありません。たとえば、構成ファイルから「com.mysql.jdbc.Driver」という名前を読み取ることができます。(Oracleの)他のドライバーを使用したいが、コードを変更したくない場合があります。上記の方法では、これは不可能であるため、適切なアプローチはを使用することClass.forName(name)です。

于 2012-10-17T11:24:18.023 に答える