2011-10-17 24 views
9

Sto guardando un po 'di codice Java, e c'è questo codice che vedo spesso.Foo.class cosa fa?

Foo.class 

Questo è stato utilizzato per indicare il Tipo di classe? è simile a

Foo.GetType(); 
typeof(Foo); 

in C#?

A cosa serve? e qual è il significato?

+1

Alcune informazioni correlate: 'System.Type' è un tipo generale in .Net e non specifico per C#. Non so se lo stesso sia o non sia vero per il tipo 'Class' nella JVM (al contrario del linguaggio Java stesso). –

+0

È piuttosto difficile trovare questa informazione proveniente da Java. Ho cercato "C# class object", "C# reference to class" e molti altri termini non sapendo questo è chiamato 'Type' in C# - le uniche cose che otterrai sono tutorial e introduzioni a OOP. Ma grazie per questa domanda :-) – Mitja

risposta

12

Sì, Foo.class in Java è equivalente a typeof(Foo) in C#. Vedere section 15.8.2 of the JLS per ulteriori informazioni sui valori letterali .

È non la stessa chiamata GetType() su un riferimento, che ottiene il esecuzione tempo type di un oggetto. L'equivalente Java di questo è someReference.getClass().

Una ragione per cui si può vedere più spesso nel codice Java che in C# è in relazione ai generici. Non è del tutto inusuale per avere qualcosa di simile:

public class Generic<T> 
{ 
    private final Class<T> clazz; 

    public Generic(Class<T> clazz) 
    { 
     this.clazz = clazz; 
    } 
} 

Questo consente l'accesso di esecuzione in tempo per la classe di riflessione ecc Questo è necessaria solo in Java a causa di cancellazione del tipo, per cui un oggetto di un tipo generico può di solito determinano i suoi argomenti tipo al momento dell'esecuzione.

+0

fantastico. Grazie. – DarthVader

+0

ottimo. Trovo un po 'strano che lo chiamino clazz :) – DarthVader

+2

@ user177883: Beh, questa è una convenzione. Altri possono usare nomi diversi. È solo perché 'class' è una parola chiave. –

2

c'è una classe speciale in java denominata Classe. eredita Oggetto. la sua istanza rappresenta le classi e le interfacce in java runtime e rappresenta anche enum, array, tipi primitivi di Java (booleano, byte, char, short, int, long, float, double) e la parola chiave void. quando una classe viene caricata, o il metodo defineClass() del class loader viene chiamato da JVM, quindi JVM crea un oggetto Class.

Java ci consente di creare un oggetto Classe corrispondente di una classe in molti modi, e .class è uno di questi. ad es.

Class c1 = String.class;