2017-03-16 2 views
0

Ich weiß Definition. Wir verwenden Class.forName(""), wenn wir den Typ der Klasse nicht kennen, aber das ist das Rätsel hier.Was ist der Vorteil der Verwendung von Class.forName() gegenüber dem neuen Schlüsselwort zum Laden einer Instanz?

Wenn ich sage:

Class.forName("SomeClass"); 

So weiß ich, welche Art von "Someclass". Also alle Compiler tut in Class.forName("SomeClass") Fall ist nicht überprüft, ob "SomeClass" existiert oder nicht während der Kompilierzeit. Aber es wird es zur Laufzeit überprüfen. Aber ist es wirklich der Vorteil? Kann mir das jemand in Echtzeit erklären?

+1

Was passiert, wenn Sie zur Kompilierungszeit nicht wissen, welche bestimmte Klasse Sie wollen? – chrylis

Antwort

0

Class.forName() lädt eine Klasse, die zur Kompilierzeit nicht vorhanden sein muss - sie muss nur vorhanden sein, wenn Class.forName() ausgeführt wird (oft Klassenladezeit, könnte auch Laufzeit sein, abhängig davon, wo die Anweisung angegeben ist) . Dies ist häufig der Fall bei datenbankspezifischen Datenbanktreibern, bei denen Implementierungsklassen vom Anwendungscontainer bereitgestellt werden und Sie sich bei der Entwicklung Ihrer App nicht um die Instanz kümmern müssen.

Eine Alternative, die die Klasse bei der Kompilierung geladen werden würde, wäre so etwas wie dieses:

import com.someclass.Foo; 

Foo foo; // class would be loaded 

Dies ist jedoch noch nicht Instanz einer Klasse, die mit new Schlüsselwort erstellt wird. Instanzen sind unterschiedlich - wenn Sie eine Instanz möchten, würden Sie immer noch mit new erstellen, unabhängig davon, wie Sie tatsächlich die Klasse laden.

1

Class.forName() gibt Ihnen die Klasse für den angegebenen Namen. Es instanziiert es nicht. Sie könnte Class.newInstance() dafür verwenden (aber es gibt Probleme mit, dass - siehe here für weitere Informationen)

Beachten Sie, dass Sie diese verwenden würde in (sagen wir) einen Rahmen, in dem eine Konfigurationsdatei den Namen der Klasse identifiziert Sie möchte laden. d. h., diese Klasse könnte unter Laufzeit geändert werden (z. B. eine Spring XML-Konfiguration). In diesen Situationen ist es sehr wahrscheinlich, dass Ihre Klassenwahl alle eine gemeinsame Schnittstelle implementiert - andernfalls ist es für den nachfolgenden Code schwierig, damit zu interagieren.

Verwandte Themen