Che cos’è un letterale di class in Java?

Dal tutorial di Java :

Infine, c’è anche un tipo speciale di letterale chiamato letterale di class , formato prendendo un nome di tipo e aggiungendo ” .class “; ad esempio, String.class . Questo si riferisce all’object (di tipo Class ) che rappresenta il tipo stesso.

A quale tipo di variabile può essere assegnato questo letterale?

Si prega di dare un piccolo esempio, se ansible.

 Class c = String.class; 

Dai un’occhiata a Javadoc per java.lang.Class per vedere che cosa puoi fare con uno di questi piccoli ragazzi – per lo più legati alla riflessione

Per capirlo, devi capire che String è un’istanza (object) della class Class . Una stringa letterale (ad esempio “I am a string.”) È una notazione che rappresenta un’istanza (object) della class String , mentre un letterale di class (ad es. Hashtable.class) è una notazione che rappresenta un’istanza della class Class .

Grazie alle altre buone risposte qui, sai di cosa si tratta, ma ecco un tipico esempio di utilizzo che può chiarire anche:

  private static Logger log = Logger.getLogger(YourClassHere.class); 

Come suggerisce il codice, questa è una linea in cui inizializziamo un framework di registrazione (in questo esempio, sto utilizzando il pacchetto org.apache.log4j , ma il principio si estende ad altri framework). Il metodo getLogger() richiede un valore letterale di class in modo che sappia cosa sta registrando (ovvero la class dell’object corrente).

Secondo il JLS

15.8.2 Classali letterali

Un letterale di class è un’espressione che consiste nel nome di una class, di un’interfaccia, di un array o di un tipo primitivo seguito da a . e la class token. Il tipo di un letterale di class è Class . Valuta l’object Class per il tipo named (o per void ) come definito dal loader di class definitivo della class dell’istanza corrente.

Alcuni usi comuni possono essere trovati in Class Literals come token di tipo runtime .

Il letterale stesso è MyClass . Se scrivi MyClass.class ottieni un riferimento all’object class. Se scrivi new MyClass() , usa il letterale per ottenere un’istanza dell’object di class che ricevi in MyClass.class . myClassInstance.getClass() si ottiene lo stesso object di class chiamando myClassInstance.getClass() .

Non sono sicuro al 100%, ma il letterale non può essere assegnato a nessuna variabile. Quello che puoi fare è ottenere il nome della class come stringa e usare il framework reflection per creare un’istanza.

In alcuni esempi è qualcosa del genere:

 Class myClass = MyClass.class 

o

 MyClass.class.getResourceAsStream("config.properties"); 

Per capirlo, devi capire che String è instance (object) del suo instance (object) superclass (parent class) .

Il valore di instance (object) class String è un String literal (es. "I am a string." ):

 class | instance (object) | literal ------------------------------------------------ String | instance_name = | "I am a string." 

mentre il valore instance (object) class Object instance (object) è un Class literal – (ad esempio Hashtable.class ) che fa riferimento instance (object) class Hashtable instance (object)

 class | instance (object) | literal ------------------------------------------------ Hashtable | instance_name | Hashtable. 

Quando la JVM carica le classi dell’applicazione, le archivia con oggetti java.class.Class . Quindi, di solito ci sono diverse istanze di tipo Class in memoria che rappresentano le tue classi. Quindi puoi fare qualcosa del genere:

 Class bicycleClass = Bicycle.class; // returns the object storing your Bicycle class bicycleClass.getName(); // returns your class name bicycleClass.getDeclaredMethods(); // returns your (declared) class methods