Verständnisproblem Class.forName()

temi

Top Contributor
Ich lese gerade etwas über die H2 Datenbank und bin dabei über diesen Beispielcode gestolpert:
Java:
import java.sql.*;
public class Test {
    public static void main(String[] a)
            throws Exception {
        Class.forName("org.h2.Driver"); // ?????
        Connection conn = DriverManager.
            getConnection("jdbc:h2:~/test", "sa", "");
        // add application code here
        conn.close();
    }
}

Ich verstehe das "Class.forName(...)" nicht ganz. Laut Doku "... returns the Class object associated with the class or interface with the given string name." Es wird demnach ein Klassenobjekt zurückgeliefert, das anhand des Names im Klassenpfad gesucht wird. Ich könnte es jetzt einigermaßen verstehen, wenn der Rückgabewert irgendeiner Variablen zugewiesen wird, aber der Befehl steht einfach nur so für sich im Raum. Verstehe ich nicht🙁

Warum überhaupt auf diese Art und Weise? Warum wird hier nicht einfach "import org.h2.Driver" gemacht, usw.?
 
Hier wird einfach geprüft ob die Klasse vorhanden ist. Der Rückgabewert ist dabei uninteressant, da das nicht vorhanden sein der Klasse eine Exception auslösen würde, welche dann entsprechend behandelt wird.

Gruß

Claus
 
Das war ursprünglich nötig, um den spezifischen Driver mit dem DriverManager bekannt zu machen.

Das explizite Laden der Klasse führt deren statischen Initializer aus, der so implementiert sein sollte, dass DriverManager.registerDriver aufgerufen wird.
Ein reiner Import lädt die Klasse nicht, führt also auch keinen Code aus dieser aus.


Mittlerweile sollte das aber auch über Service Provider ohne das explizite Laden klappen.
 
Das heißt, der DriverManager
Mittlerweile sollte das aber auch über Service Provider ohne das explizite Laden klappen.
Wie funktioniert der Mechanismus dahinter? Muss dazu noch was konfiguriert werden?

Die Antwort steht vermutlich hier:
When the method getConnection is called, the DriverManager will attempt to locate a suitable driver from amongst those loaded at initialization and those loaded explicitly using the same classloader as the current applet or application.
Stichwort ist demnach "classloader". Hm, damit kann ich grad noch nix anfangen, muss ich mich erst mal belesen.
 

Zurück
Oben