web-dev-qa-db-fra.com

Qu'est-ce qu'un littéral de classe en Java?

À partir du tutoriel Java :

Enfin, il existe également un type spécial de littéral appelé littéral class, formé en prenant un nom de type et en ajoutant ".class"; par exemple, String.class. Cela fait référence à l'objet (de type Class) qui représente le type lui-même.

A quel type de variable ce littéral peut-il être affecté?

S'il vous plaît donner un petit exemple si possible.

46
gameover
Class<String> c = String.class;

Consultez la Javadoc pour Java.lang.Class pour voir ce que vous pouvez faire avec l’un de ces petits gars - principalement lié à la réflexion

45
Steven Schlansker

Pour comprendre cela, vous devez comprendre que String est une instance (objet) de la classe Class . Un littéral de chaîne (par exemple, "Je suis une chaîne") est une notation qui représente une instance (objet) de la classe String , tandis qu'un littéral de classe (par exemple, Hashtable.class) est une notation qui représente une instance de la classe classe .

35
shinkou

Merci aux autres bonnes réponses ici, vous savez ce que c'est, mais voici un exemple d'utilisation typique qui peut aussi clarifier:

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

Comme le code l'indique, il s'agit d'une ligne dans laquelle nous initialisons un cadre de journalisation (dans cet exemple, j'utilise le paquetage org.Apache.log4j, mais le principe s'étend à d'autres cadres). La méthode getLogger() nécessite un littéral de classe afin de savoir ce qu’elle enregistre (c’est-à-dire la classe de l’objet en cours).

21
Ben

Selon le JLS

15.8.2 Littéraux de classe

Un littéral de classe est une expression constituée du nom d'une classe, d'une interface, d'un tableau ou d'un type primitif, suivi d'un . et du jeton class. Le type d'un littéral de classe est Class. Il correspond à l'objet Class pour le type nommé (ou pour void) défini par le chargeur de classes qui définit la classe de l'instance actuelle. 

10
stacker

Certaines utilisations courantes peuvent être trouvées dans Class Literals sous forme de jetons de type d'exécution .

5
trashgod

Le littéral lui-même est MyClass. Si vous écrivez MyClass.class, vous obtenez une référence à l'objet de classe. Si vous écrivez new MyClass(), il utilise le littéral pour vous obtenir une instance de l'objet de classe que vous obtenez par MyClass.class. Depuis l'instance, vous obtenez le même objet de classe en appelant myClassInstance.getClass().

Je ne suis pas sûr à 100%, mais le littéral lui-même ne peut être affecté à aucune variable. Ce que vous pouvez faire est d’obtenir le nom de la classe sous forme de chaîne et d’utiliser le cadre de réflexion pour créer une instance.

3
bertolami

Dans les exemples, c'est quelque chose comme ça:

Class myClass = MyClass.class

ou

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

Pour comprendre cela, vous devez comprendre que String est un instance (object) de son superclass (parent class)Object.

class String 'instance (object)' s est un String literal (par exemple "I am a string."):

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

alors que la valeur de class Object 'instance (object)' est un Class literal - (par exemple, Hashtable.class) qui fait référence à class Hashtable 's instance (object)

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

Lorsque la machine virtuelle Java charge vos classes d'application, elle les stocke sous forme d'objets Java.class.Class.

Ainsi, il existe généralement plusieurs instances de type Class en mémoire qui représentent vos classes. Donc, vous pouvez faire quelque chose comme ça:

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