Que .class
signifie Java? Par exemple, si j'ai créé une classe appelée Print
. Qu'est-ce qui Print.class
revient?
.class
syntaxe qui n'est qu'incidemment liée à l' .class
extension du nom de fichier.
Que .class
signifie Java? Par exemple, si j'ai créé une classe appelée Print
. Qu'est-ce qui Print.class
revient?
.class
syntaxe qui n'est qu'incidemment liée à l' .class
extension du nom de fichier.
Réponses:
Lorsque vous écrivez .class
après un nom de classe, il fait référence au littéral de classe -
java.lang.Class
objet qui représente des informations sur une classe donnée.
Par exemple, si votre classe est Print
, alors Print.class
est un objet qui représente la classe Print
à l'exécution. C'est le même objet qui est retourné par la getClass()
méthode de toute instance (directe) de Print
.
Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Writer.class.getDeclaredField("writeBuffer")
.
Print.class
?
new Intent(this, Activity.class
t-il? Va-t-il essayer de le découvrir en class Activity
comparant chaque classe?
.class
est utilisé lorsqu'il n'y a pas d'instance de la classe disponible.
.getClass()
est utilisé lorsqu'une instance de la classe est disponible.
object.getClass()
renvoie la classe de l'objet donné.
Par exemple:
String string = "hello";
System.out.println(string.getClass().toString());
Cela produira:
class java.lang.String
C'est la classe de l'objet string :)
getClass()
n'est utile que si vous avez une référence pointant vers un objet de la classe. ClassName.class
peut être utilisé même si la classe n'a pas d'instances. Par exemple, considérez Math.class
. Chacun est correct pour certaines situations.
.class
et.getClass().
Si une instance d'un objet est disponible, le moyen le plus simple d'obtenir sa classe est d'appeler Object.getClass()
La .class
syntaxe
Si le type est disponible mais qu'il n'y a pas d'instance, il est possible d'obtenir une classe en ajoutant .class
au nom du type. C'est également le moyen le plus simple d'obtenir la classe pour un type primitif.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Juste pour clarifier, cette méthode '.class' ne fait pas référence au fichier bytecode que vous voyez après la compilation du code java ni à une confusion entre les concepts de classe vs objet dans la théorie POO.
Cette méthode '.class' est utilisée en Java pour la réflexion de code. En règle générale, vous pouvez collecter des métadonnées pour votre classe telles que le nom complet de la classe qualifiée, la liste des constantes, la liste des champs publics, etc., etc.
Consultez ces liens (déjà mentionnés ci-dessus) pour obtenir tous les détails:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
Normalement, vous ne prévoyez pas d'utiliser Reflection tout de suite lorsque vous commencez à créer votre projet. C'est quelque chose dont vous savez avoir besoin après avoir essayé de gérer du code déjà fonctionnel. Vous en avez souvent besoin pour gérer plusieurs instances de votre programme. Peut-être souhaitez-vous identifier chaque «clone» particulier pour déterminer si quelque chose est déjà défini, ou compter le nombre de fonctions, ou simplement enregistrer les détails d'une instance particulière de votre classe.
S'il n'y a pas d'instance disponible, la .class
syntaxe est utilisée pour obtenir l'objet Class correspondant pour une classe, sinon vous pouvez utiliser la méthode getClass () pour obtenir l'objet Class. Puisqu'il n'y a pas d'instance de type de données primitif, nous devons utiliser la .class
syntaxe pour les types de données primitifs.
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());
}
}
Je pense que la clé ici est de comprendre la différence entre une classe et un objet. Un objet est une instance d'une classe. Mais dans un langage entièrement orienté objet, une classe est aussi un objet . Donc, appeler .class
obtient la référence à l'objet Class de cette classe, qui peut ensuite être manipulée.
in a fully object-oriented language, a Class is also an Object
? <citation nécessaire>
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, ou du pseudo-type void, suivi d'un '.' et la classe de jeton. L'un des changements dans JDK 5.0 est que la classe java.lang.Class est générique java.lang.Class Class<T>
, donc:
Class<Print> p = Print.class;
Références ici:
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