Cosa significa .class in Java?


149

Cosa .classsignifica in Java? Ad esempio, se ho creato una classe chiamata Print. Cosa Print.classritorna?



Temo di non capire appieno quello che stai chiedendo. Se potessi elaborare un po 'di più, qualcuno potrebbe essere in grado di fornirti informazioni più utili
Paul Walker,

28
Questa sicuramente mi sembra una vera domanda. Stavo solo facendo questa domanda da solo, e mi sono ritrovato qui dopo una rapida ricerca su Google. Immagino che non avrei dovuto preoccuparmi se avessi saputo che la mia domanda non era reale!
Doctor Jones,

1
Inoltre, penso a causa dell'imbarazzo di una particolare stringa di ricerca, c'è poco scritto o reperibile su questa domanda. A parte i documenti API collegati sopra, non ho mai visto questa notazione menzionata altrove (anche se spesso la vedi usata in riflessione).
jordanpg,

2
@MadProgrammer l'OP chiede della .classsintassi che è solo incidentalmente correlata .classall'estensione del nome file.
jordanpg,

Risposte:


143

Quando scrivi .classdopo il nome di una classe, fa riferimento al letterale della classe - java.lang.Classoggetto che rappresenta le informazioni su una determinata classe.

Ad esempio, se la tua classe è Print, allora Print.classè un oggetto che rappresenta la classe Printin fase di esecuzione. È lo stesso oggetto che viene restituito dal getClass()metodo di qualsiasi istanza (diretta) di Print.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());

2
Quali sono alcune delle cose che si possono fare con un oggetto di classe?
Kevin,

7
@Kevin Consulta la documentazione API per java.lang.Class .
Patricia Shanahan,

Applicazione: l'accesso ai campi privati, per esempio: Writer.class.getDeclaredField("writeBuffer").
jordanpg,

2
Quindi qual è il tipo di Print.class?
Zhipeng YANG,

1
E come gestisce Android new Intent(this, Activity.class? Proverà a scoprirlo class Activityconfrontando ogni classe?
Zhipeng YANG,

56

.class viene utilizzato quando non è disponibile un'istanza della classe.

.getClass() viene utilizzato quando è disponibile un'istanza della classe.

object.getClass() restituisce la classe dell'oggetto indicato.

Per esempio:

String string = "hello";
System.out.println(string.getClass().toString());

Questo produrrà:

class java.lang.String

Questa è la classe dell'oggetto stringa :)


7
getClass()è utile solo se hai un riferimento che punta a un oggetto della classe. ClassName.classpuò essere usato anche se la classe non ha istanze. Ad esempio, considera Math.class. Ognuno è corretto per determinate situazioni.
Patricia Shanahan,

Spiegazione brillante. Giusto al punto. Adoro come hai identificato la distinzione tra .classe.getClass().
Sevastyan Savanyuk

6

Se è disponibile un'istanza di un oggetto, il modo più semplice per ottenere la sua classe è invocare Object.getClass()

La .classsintassi

Se il tipo è disponibile ma non esiste un'istanza, è possibile ottenere una classe aggiungendo .classil nome del tipo. Questo è anche il modo più semplice per ottenere la classe per un tipo primitivo.

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

Vedi: docs.oracle.com sulla classe


6

Giusto per chiarire, questo metodo '.class' non si riferisce al file bytecode che vedi dopo aver compilato il codice java né una confusione tra i concetti di Class vs. Object nella teoria OOP.

Questo metodo '.class' è usato in Java per il codice Reflection. Generalmente puoi raccogliere metadati per la tua classe come il nome completo della classe qualificata, l'elenco delle costanti, l'elenco dei campi pubblici, ecc. Ecc.

Controlla questi collegamenti (già menzionati sopra) per ottenere tutti i dettagli:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html

Normalmente non hai intenzione di usare subito Reflection quando inizi a costruire il tuo progetto. È qualcosa che sai di aver bisogno dopo aver provato a gestire un codice già funzionante. Molte volte ne hai bisogno per gestire più istanze del tuo programma. Forse vuoi identificare ogni particolare 'clone' per determinare se qualcosa è già definito, o contare il numero di funzioni, o semplicemente semplicemente registrare i dettagli di una particolare istanza della tua classe.


3

Se non è disponibile alcuna istanza, .classviene utilizzata la sintassi per ottenere l'oggetto Class corrispondente per una classe, altrimenti è possibile utilizzare il metodo getClass () per ottenere l'oggetto Class. Poiché non esiste un'istanza del tipo di dati primitivo, dobbiamo usare la .classsintassi per i tipi di dati primitivi.

    package test;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }

1

Penso che la chiave qui sia capire la differenza tra una Classe e un Oggetto. Un oggetto è un'istanza di una classe. Ma in un linguaggio completamente orientato agli oggetti, una classe è anche un oggetto . Quindi la chiamata .classottiene il riferimento all'oggetto Class di quella classe, che può quindi essere manipolata.


4
in a fully object-oriented language, a Class is also an Object? <citazione necessaria>
Sam Dufel il

0

Un letterale di classe è un'espressione consistente nel nome di una classe, interfaccia, matrice o tipo primitivo o nel vuoto pseudo-tipo, seguito da un '.' e la classe token. Una delle modifiche in JDK 5.0 è che la classe java.lang.Class è generica java.lang.Class Class<T>, quindi:

Class<Print> p = Print.class;

Riferimenti qui:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.