2010-07-20 7 views
5

Je construis une petite application Android, mais c'est plus une question Java qu'une question android. En regardant à travers les didacticiels il y a des lignes qui ressemblent à:En Java, que fait une référence à Class.class?

startService(new Intent(this, MyService.class)); 

ce que fait exactement le champ « MyService.class » représentent? Est-ce juste une référence à la classe pour un modèle?

Merci.

Répondre

5

La réponse d'Andy est tout à fait correcte, mais je voudrais développer un peu le sujet.

.class est une syntaxe spéciale pour l'obtention d'une instance d'un objet Class. Il peut être utilisé lorsque seul le type est disponible et qu'aucune instance de l'objet associé n'est disponible. Il peut être utilisé avec n'importe quel nom de type concret, y compris les tableaux et les primitives. Par exemple, int.class est valide.

Cette manière (et d'autres manières) d'obtenir un objet Class est documentée dans l'ancien Sun reflection API docs.

La syntaxe spéciale .class apparaît souvent dans l'utilisation idiomatique comme un "jeton de type" dans le code générique. Un littéral de classe obtenu avec .class est appelé un jeton de type lorsqu'il est "passé parmi les méthodes pour communiquer à la fois des informations de type à la compilation et à l'exécution" (Joshua Bloch's Effective Java 2e, page 142).

3

Oui, MyService.class renvoie un objet de classe qui représente la classe MyService. L'intention l'utilise pour identifier le service ou l'activité que vous avez l'intention de démarrer.

+0

Y at-il plus d'informations sur l'utilisation de java de l'accord .class? Je comprends quel est le résultat de son utilisation, mais pourquoi Java utilise-t-il cette implémentation? Pourquoi cette syntaxe existe-t-elle au lieu de simplement appeler comme un nouveau MyService(). – Falmarri

+0

Je ne suis pas un expert, mais je soupçonne que cela a quelque chose à voir avec l'architecture d'Android essayant de minimiser ou de cacher l'interaction du développeur avec la création explicite d'activité ou de service. Je ne sais pas précisément pourquoi, mais je vais essayer de le découvrir. –

+1

Cela se fait généralement à cause de l'effacement de type des génériques Java. Vous pouvez passer .class à une méthode avec le type de paramètre Classe afin de capturer le type d'exécution d'une classe, car vous ne pouvez pas faire grand-chose en toute sécurité avec un paramètre générique lui-même. –

1

MyService.class Le MyService.class vous permet d'obtenir l'objet Class décrivant la classe MyClass, à partir du nom de classe seul (par opposition à avoir une instance de la classe pour demander object.getClass()).

1

En JVM, lorsqu'une classe est chargée, un objet de type Class représente la classe chargée en mémoire. com.abc.MyClass.class est une expression littérale qui représente l'objet Class pour la classe com.abc.MyClass.

Le même objet Class peut également être obtenu en appelant la méthode myClassReference.getClass() si vous avez une référence à un objet de la classe. L'objet Class peut être utilisé pour trouver les informations sur la structure de la classe, accéder à des champs, appeler des méthodes et instancier des objets de la classe à l'aide de l'API Java Reflection.

Questions connexes