2010-07-20 16 views
5

Estoy construyendo una pequeña aplicación de Android, pero esto es más una pregunta de Java que una pregunta de Android. Mirando a través de los tutoriales que hay líneas que se parecen:En Java, ¿qué hace una referencia a Class.class?

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

lo que hace exactamente el campo "MyService.class" representa? ¿Es solo una referencia a la clase para una plantilla?

Gracias.

Respuesta

5

La respuesta de Andy es definitivamente correcta, pero quiero ampliar un poco el tema.

es una sintaxis especial para obtener una instancia de un objeto de clase. Se puede usar cuando solo el tipo está disponible y no hay ninguna instancia del objeto relacionado alrededor. Se puede usar con cualquier nombre de tipo concreto, incluidas matrices y primitivas. Por ejemplo, int.class es válido.

De esta forma (y de otras maneras) para obtener un objeto Clase están documentadas en el antiguo Sun reflection API docs.

La sintaxis especial .class a menudo aparece en el uso idiomático como un "token de tipo" en el código genérico. Un literal de clase obtenido con .class se denomina token de tipo al pasar "entre métodos para comunicar tanto información en tiempo de compilación como de tipo de tiempo de ejecución" (Joshua Bloch's Effective Java 2e, p.142).

3

Sí, MyService.class devuelve un objeto Clase que representa la clase MyService. Intent lo usa para identificar qué servicio o actividad está intentando iniciar.

+0

¿Hay más información sobre el uso de java de la oferta .class? Entiendo cuál es el resultado de usarlo y demás, pero ¿por qué Java usa esta implementación? ¿Por qué esa sintaxis existe incluso en lugar de simplemente llamar como nuevo MyService()? – Falmarri

+0

No soy un experto, pero sospecho que tiene algo que ver con la arquitectura de Android que trata de minimizar u ocultar la interacción del desarrollador con la creación explícita de objetos de actividad o servicio. No sé específicamente por qué, pero intentaré averiguarlo. –

+1

Generalmente se realiza debido al borrado de tipos de los genéricos de Java. Puede pasar .class a un método con el tipo de parámetro Clase para capturar el tipo de tiempo de ejecución de una clase, ya que no puede hacer mucho con un parámetro genérico. –

1

El MyService.class le permite obtener la clase de objeto que describe la clase MiClase, desde el nombre de la clase sola (en contraposición a tener una instancia de la clase para pedir object.getClass()).

1

En JVM, cuando se carga una clase, un objeto del tipo Class representa la clase cargada en la memoria. com.abc.MyClass.class es una expresión literal que representa el objeto Class para la clase com.abc.MyClass.

También se puede obtener el mismo objeto Class llamando al método myClassReference.getClass() si tiene una referencia a un objeto de la clase.

El objeto Class se puede utilizar para encontrar la información sobre la estructura de la clase, los campos de acceso, invocar métodos y crear instancias de objetos de la clase utilizando Java API de reflexión.

Cuestiones relacionadas