# Warum Class.forName();



## ruediger (7. Nov 2011)

Hi Leute,

ich habe nun angefangen mich ein bischen mit dem Zugriff auf einer SQL Datenbank über Java zu beschäftigen und soweit funktioniert auch alles. Ich frage mich nur, wie genau der Ablauf ist beim Treiber laden.



```
SQLOperations() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            dataBaseConnection = DriverManager.getConnection(url, username, password);
            statement = dataBaseConnection.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
```

In dem obigen Code (Konstruktoraufruf) wird der Treiber ja über Class.forName() geladen. Deise Methode gibt ein Objekt der eingegebenen Klasse zurück, allerdings landet dieses Objekt doch ins leere oder nicht? Und woher kennt der DriverManager nun den Treiber.


----------



## Beni (7. Nov 2011)

"Driver" hat einen statischen Initializer, der wird automatisch aufgerufen wenn die Klasse geladen wird. In dem Initializer kann sich der Treiber selbst registrierten (z.B. im DriverManager).

[Edit: siehe auch hier]


----------



## TheDarkRose (7. Nov 2011)

Nein, hier wird die Klasse zur Laufzeit mithilfe eines Classloaders geladen.


----------



## tfa (7. Nov 2011)

Durch das Laden der Klasse wird diese initialisiert (der statische Initialisierer wird aufgerufen). Hier meldet sich der Treiber beim DriverManager an und kann fortan benutzt werden. Das Class-Objekt selbst braucht man nicht. Wichtig ist nur der "Seiteneffekt" der Klasseninitialisierung.


----------



## ruediger (7. Nov 2011)

Ich glaube ich habs jetzt verstanden.

Also beim Aufruf von Class.forName("com.mysql.jdbc.Driver"); wird im Konstruktor von Driver der Treiber an DriverManager übergeben.

Also im Grunde genommen nichts anderes, als wenn man sich die Klasse com.mysql.jdbc.Driver über den import holt und ein Objekt davon erzeugt.

So richtig? 

und danke für die schnellen Antworten :toll:


----------



## musiKk (7. Nov 2011)

Nicht ganz. Durch [c]forName()[/c] wird sicher gestellt, dass der statische Initialisierer ausgeführt wird (ein [c]static[/c]-Block). Das Erzeugen einer Instanz der Klasse hat zwar den gleichen Effekt, [c]forName()[/c] erzeugt allerdings keine Instanz.

AFAIR ist diese Art der Registrierung Pflicht für JDBC-Treiber ab Version 4.


----------



## SlaterB (7. Nov 2011)

eine statische Methode, etwa Driver.init(), wäre annehmbare Alternative,
ein deutlich wichtigerer Punkt bei Class.forName() ist noch, dass die Klasse eben nicht importiert werden muss,
der Treiber liegt in einer separaten Bibliothek, wird erst bei Ausführung benötigt


----------



## turtle (7. Nov 2011)

Wie bereits angedeutet, möchte ich noch einmal hinweisen, dass das Laden eines JDBC 4.0-kompatiblen Treibers nicht mehr notwendig ist, also überhaupt kein Class.forName() mehr!


----------

