2010-07-20 8 views
5

Sto costruendo una piccola applicazione Android, ma questa è più una domanda Java che una domanda Android. Guardando attraverso le esercitazioni ci sono linee che assomigliano:In Java, cosa fa un riferimento a Class.class?

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

che cosa fa esattamente il campo "MyService.class" rappresenta? È solo un riferimento alla classe per un modello?

Grazie.

risposta

5

La risposta di Andy è decisamente corretta, ma voglio approfondire un po 'il punto.

.class è una sintassi speciale per ottenere un'istanza di un oggetto Classe. Può essere utilizzato quando solo il tipo è disponibile e nessuna istanza dell'oggetto correlato è presente. Può essere utilizzato con qualsiasi nome di tipo concreto, inclusi array e primitive. Ad esempio, int.class è valido.

In questo modo (e in altri modi) ottenere un oggetto di classe sono documentati nel vecchio Sun reflection API docs.

La sintassi speciale .class appare spesso nell'uso idiomatico come "tipo token" nel codice generico. Un letterale di classe ottenuto con .class viene chiamato token di tipo quando "viene passato tra i metodi per comunicare sia le informazioni sul tipo di runtime che di compilazione" (Joshua Bloch's Effective Java 2e, p. 142).

3

Sì, MyService.class restituisce un oggetto di classe che rappresenta la classe MyService. The Intent la utilizza per identificare il servizio o l'attività che intendi avviare.

+0

Esistono ulteriori informazioni sull'utilizzo di java dell'offerta .class? Capisco qual è il risultato del suo utilizzo e tale, ma perché java usa questa implementazione? Perché esiste anche quella sintassi invece di chiamare semplicemente MyService(). – Falmarri

+0

Non sono esperto, ma sospetto che abbia qualcosa a che fare con l'architettura di Android cercando di minimizzare o nascondere l'interazione dello sviluppatore con la creazione di oggetti o attività esplicite. Non so esattamente perché, ma cercherò di scoprirlo. –

+1

Di solito è fatto a causa della cancellazione del tipo di generici Java. È possibile passare .class a un metodo con il tipo di parametro Classe per acquisire il tipo di esecuzione di una classe, poiché non è possibile fare molto con un parametro generico. –

1

Il MyService.class consente di ottenere l'oggetto Class che descrive la classe MyClass, solo dal nome della classe (al contrario di avere un'istanza della classe per chiedere object.getClass()).

1

In JVM, quando una classe viene caricata, un oggetto del tipo Class rappresenta la classe caricata in memoria. com.abc.MyClass.class è un'espressione letterale che rappresenta l'oggetto Class per la classe com.abc.MyClass.

Lo stesso oggetto Class può anche essere ottenuto chiamando il metodo myClassReference.getClass() se si dispone di un riferimento a un oggetto della classe.

L'oggetto Class può essere utilizzato per trovare le informazioni sulla struttura della classe, i campi di accesso, i metodi di richiamo e gli oggetti di istanza della classe utilizzando Java Reflection API.