2012-06-18 10 views
7

Wir Klasse Klasse Objekt von 3 Methoden erhalten können:Unterschied zwischen MyClass.class und Class.forName ("classname")

  • MyClass.class
  • obj.getClass
  • Class.forName (“ className ")

Ich verstehe nicht den Unterschied zwischen: MyClass.class und Class.forName("className").

Da beide Klassenname benötigen.

+0

mögliches Duplikat von [Was ist der Unterschied zwischen dem Aufruf von MyClass.class und MyClass.getClass()] (http://stackoverflow.com/questions/2467970/whats-the-difference-between-calling-myclass-class-and-myclass-) getclass) –

+0

Die Vorschläge oder Implikationen, die in verschiedenen Antworten gemacht werden, dass MyClass.class keine Laufzeitnachschlage verursacht, sind falsch. Es verursacht nur eine * frühere * Laufzeitsuche, wenn die Klasse, die die Referenz enthält, geladen wird! und ein Nachschlagefehler ist für diesen Ladevorgang fatal. – EJP

Antwort

11
Class.forName("className"); 

forName ist eine statische Methode der Klasse "Class". müssen wir den vollständig qualifizierten Namen der gewünschten Klasse angeben. Dies kann verwendet werden, wenn der Name der Klasse zur Laufzeit bekannt wird.

ClassName.class; 

.class ist keine Methode, es ist ein Schlüsselwort und kann mit primitiven Typ wie int verwendet werden. wenn Name der Klasse im Voraus bekannt ist & es wird zu projizieren, dass die Zeit nutzen wir ClassName.class

+7

oder kurz: Laufzeit-Lookup vs. Kompilierzeit-Lookup –

+0

.class ist kein Schlüsselwort. – EJP

8

Ich verstand nicht den Unterschied zwischen: MyClass.class und Class.forName("className").

Da beide Klassenname benötigen.

Der große Unterschied ist wenn sie brauchen es. Da Class.forName einen String akzeptiert, kann der Klassenname zur Laufzeit festgelegt werden. Dagegen wird MyClass.class zur Kompilierzeit bestimmt. Dies macht Class.forName nützlich für das dynamische Laden von Klassen basierend auf der Konfiguration (z. B. Laden von Datenbanktreibern abhängig von den Einstellungen einer Konfigurationsdatei).

Abgerundet aus: obj.getClass() nützlich ist, weil Sie nicht die tatsächliche Klasse eines Objekts   — zum Beispiel in einem Verfahren wissen, wo Sie ein Argument über eine Schnittstelle akzeptieren, anstatt Klasse, wie in foo(Map m). Sie kennen die Klasse m nicht, nur dass es etwas implementiert, das Map implementiert. (Und 99% der Zeit, sollten Sie nicht egal, was seine Klasse ist, sondern dass 1% taucht gelegentlich.)

+0

nette Erklärung –

1
Class.forName("className"); 

Es dynamisch laden die Klasse basiert auf vollständig qualifizierten Klassennamen String.

Gibt das Objekt java.lang.Class zurück, das die Laufzeitklasse des Objekts darstellt.

MyClass.class: 

A class Literal ist ein Ausdruck des Namen einer Klasse, Schnittstelle, array, oder primitiven Typs oder pseudo-Typ void, gefolgt von a bestehend '' und die Tokenklasse. Der Typ C.class, wobei C der Name einer Klasse, einer Schnittstelle oder eines Array-Typs ist, lautet Class<C>.

http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

1

Ein wichtiger Unterschied ist: A.class Laden durchführen wird und die Verknüpfung der Klasse A. Class.forName ("A") wird Laden durchführen, die Verknüpfung und die Initialisierung der Klasse A.

Verwandte Themen