Il metodo getClass(), l'oggetto Class e un'introduzione a Reflection - 1

"Ciao, Amico!"

"Ora è il momento dell'evento principale. Faremo conoscenza con la classe Class e toccheremo Reflection.
Come probabilmente avrai già capito, tutto in Java è un oggetto. E di cosa ha bisogno un oggetto? Che cosa ha ogni oggetto che definisce di cosa si tratta?"

"Una classe!"

"Giusto! Ben fatto. Ogni oggetto ha una classe. Ma tornando agli oggetti... Alcuni oggetti contengono interamente un'entità, mentre altri semplicemente aiutano a gestirla."

"Quest'ultimo tipo include FileOutputStream e Thread . Quando si crea un oggetto Thread , non viene creato un nuovo thread. Il thread viene creato dalla macchina virtuale Java dopo che è stato chiamato il metodo start(). Questo oggetto aiuta semplicemente a gestire il processo."

"Lo stesso con FileOutputStream : il file è archiviato su disco e il sistema operativo gestisce l'archiviazione e l'accesso. Ma possiamo interagire con esso tramite oggetti File, ancora una volta con l'aiuto della macchina virtuale Java."

"Sì, questo l'ho già capito."

"Quindi, c'è una classe speciale chiamata Class per interagire con le classi."

"Non era difficile da indovinare."

"Sì. Ogni volta che la macchina virtuale Java carica una nuova classe in memoria, crea un oggetto Class, che puoi utilizzare per ottenere informazioni specifiche sulla classe caricata."

"Ogni classe e oggetto è associato a un « oggetto classe »."

Esempio Descrizione
Class clazz = Integer.class;
Ottiene l'oggetto Class della classe Integer.
Class clazz = int.class;
Ottiene l'oggetto Class della classe int.
Class clazz = "123".getClass();
Ottiene l'oggetto Class di un oggetto String.
Class clazz = new Object().getClass();
Ottiene l'oggetto Class dell'oggetto Object.

"Wow! Che interessante!"

"Ricordi che la parola class è una parola chiave in Java e non può essere utilizzata come nome di variabile?"

"Oh sì, lo so, lo so. Me ne ero solo dimenticato."

"Hai già usato l'oggetto Class da qualche parte?"

"Sì, l'abbiamo usato quando abbiamo scritto la nostra implementazione del metodo equals."

"Sì, puoi usare il metodo getClass() per verificare se gli oggetti hanno la stessa classe."

"E cosa puoi fare con questo oggetto?"

"Beh, un sacco di cose:"

codice java Descrizione
Class s = int.class;
String name = s.getName();
Ottiene il nome della classe.
Class s = Class.forName("java.lang.String");
Ottiene una classe per nome.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Confronta le classi degli oggetti.

"Interessante, ma non così bello come pensavo."

"Vuoi che sia figo? C'è anche ReflectionReflection è super figo."

"Cos'è la riflessione ?"

" Reflection è la capacità di una classe di ottenere informazioni su se stessa. Java ha classi speciali:  Field e Method , che sono simili alla classe Class per le classi. Proprio come gli oggetti Class consentono di ottenere informazioni su una classe, gli oggetti Field forniscono informazioni su un campo , e l'oggetto Method fornisce informazioni su un metodo. E guarda cosa puoi fare con loro:"

codice java Descrizione
Class[] interfaces = List.class.getInterfaces();
Ottiene un elenco di oggetti Class per le interfacce della classe List
Class parent = String.class.getSuperclass();
Ottiene l'oggetto Class della classe padre della classe String
Method[] methods = List.class.getMethods();
Ottiene un elenco dei metodi della classe List
String s = String.class.newInstance();
Crea una nuova stringa
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Ottiene il metodo length della classe String e lo chiama su String s

"Wow! Ora è davvero fantastico!"