À 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 typeClass
) 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.
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
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 .
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).
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 jetonclass
. Le type d'un littéral de classe estClass
. Il correspond à l'objet Class pour le type nommé (ou pourvoid
) défini par le chargeur de classes qui définit la classe de l'instance actuelle.
Certaines utilisations courantes peuvent être trouvées dans Class Literals sous forme de jetons de type d'exécution .
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.
Dans les exemples, c'est quelque chose comme ça:
Class myClass = MyClass.class
ou
MyClass.class.getResourceAsStream("config.properties");
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.
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