2012-06-18 11 views
7

Possiamo ottenere oggetto di classe Classe da 3 metodi:Differenza tra MyClass.class e Class.forName ("className")

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

io non capito la differenza tra: MyClass.class e Class.forName("className").

Perché entrambi avranno bisogno di Nome classe.

+0

possibile duplicato di [Qual è la differenza tra chiamare MyClass.class e MyClass.getClass()] (http://stackoverflow.com/questions/2467970/whats-the-difference- between-calling-myclass-class-and-myclass- getclass) –

+0

I suggerimenti o le implicazioni apportate in varie risposte che MyClass.class non causa una ricerca runtime sono false. Causa solo una * richiesta di runtime * precedente, quando la classe contenente il riferimento si sta caricando! e un errore di ricerca è fatale a tale caricamento. – EJP

risposta

11
Class.forName("className"); 

forName è un metodo statico della classe "Class". abbiamo bisogno di fornire il nome completo della classe desiderata. questo può essere usato quando il nome della classe verrà reso noto al runtime.

ClassName.class; 

.class non è un metodo è una parola chiave e può essere utilizzato con tipo primitivo come int. quando il nome della classe è noto in anticipo & viene aggiunto al progetto, che il tempo usiamo ClassName.class

+7

o, in breve: ricerca di runtime e ricerca del tempo di compilazione –

+0

.class non è una parola chiave. – EJP

8

io non capito la differenza tra: MyClass.class e Class.forName("className").

Perché entrambi avranno bisogno di Nome classe.

La grande differenza è quando ne hanno bisogno. Dal Class.forName accetta una stringa , il nome della classe può essere determinato in fase di runtime. Mentre, ovviamente, lo MyClass.class viene determinato in fase di compilazione. Questo rende Class.forName utile per il caricamento dinamico delle classi in base alla configurazione (ad esempio, il caricamento dei driver del database dipende dalle impostazioni di un file di configurazione).

A completare le cose: obj.getClass() è utile perché non si può conoscere la classe reale di un oggetto   — per esempio, in un metodo in cui si accetta un argomento utilizzando un'interfaccia, piuttosto che di classe, come ad esempio in foo(Map m). Non conosci la classe m, solo che è qualcosa che implementa Map. (E il 99% del tempo, si dovrebbe si cura di ciò la sua classe è, ma che l'1% le colture di tanto in tanto.)

+0

bella spiegazione –

1
Class.forName("className"); 

carico IT in modo dinamico sulla base di stringa di nome classe completo della classe.

obj.getClass 

Restituisce l'oggetto java.lang.Class che rappresenta la classe di runtime dell'oggetto.

MyClass.class: 

Un class letterale è un'espressione costituita dal nome di una classe, interfaccia, matrice, o primitiva tipo, o pseudo-tipo void, seguito da a '' e la classe di token. Il tipo di C.class, dove C è il nome di un tipo di classe, interfaccia o array è Class<C>.

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

1

Una differenza importante è: A.class eseguirà carico e collegamento di classe A. Class.forName ("A") si esibirà il caricamento, il collegamento e l'inizializzazione di classe A.