Metoda getClass(), obiectul Class și o introducere în Reflection - 1

"Bună, Amigo!"

„Acum este timpul pentru evenimentul principal. Ne vom familiariza cu clasa Class și vom atinge Reflection.
După cum probabil ați realizat deja, totul în Java este un obiect. Și de ce are nevoie un obiect? Ce are fiecare obiect care definește despre ce este vorba?"

"O clasa!"

"Bine! Bravo. Fiecare obiect are o clasă. Dar revenind la obiecte... Unele obiecte conțin în întregime o entitate, în timp ce altele pur și simplu ajută la gestionarea acesteia."

„Acest ultim tip include FileOutputStream și Thread . Când creați un obiect Thread , un fir nou nu este creat. Firul este creat de mașina virtuală Java după ce metoda start() este apelată. Acest obiect pur și simplu ajută la gestionarea procesului.”

"La fel și cu FileOutputStream : fișierul este stocat pe disc, iar sistemul de operare gestionează stocarea și accesul. Dar putem interacționa cu el prin obiecte File, încă o dată cu ajutorul mașinii virtuale Java."

— Da, am înțeles deja asta.

„Deci, există o clasă specială numită Class pentru interacțiunea cu clasele.”

— Nu a fost greu de ghicit.

„Da. De fiecare dată când mașina virtuală Java încarcă o nouă clasă în memorie, creează un obiect Class, pe care îl poți folosi pentru a obține informații specifice despre clasa încărcată.”

„Fiecare clasă și obiect este asociată cu un „ Obiect de clasă ”.”

Exemplu Descriere
Class clazz = Integer.class;
Obține obiectul Class al clasei Integer.
Class clazz = int.class;
Obține obiectul Class al clasei int.
Class clazz = "123".getClass();
Obține obiectul Class al unui obiect String.
Class clazz = new Object().getClass();
Obține obiectul Class al obiectului Object.

"Uau! Ce interesant!"

„Îți amintești că clasa de cuvinte este un cuvânt cheie în Java și nu poate fi folosit ca nume de variabilă?”

"Oh, da, știu, știu. Pur și simplu am uitat."

— Ai folosit deja obiectul Class undeva?

„Da, l-am folosit atunci când am scris propria noastră implementare a metodei equals”.

„Da, puteți utiliza metoda getClass() pentru a testa dacă obiectele au aceeași clasă.”

— Și ce poți face cu acest obiect?

"Ei bine, multe lucruri:"

Cod Java Descriere
Class s = int.class;
String name = s.getName();
Obține numele clasei.
Class s = Class.forName("java.lang.String");
Obține o clasă după nume.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Compară clasele obiectelor.

— Interesant, dar nu atât de cool pe cât credeam.

"Vrei să fie cool? Există și ReflectionReflection este super cool."

"Ce este Reflecția ?"

Reflection este capacitatea unei clase de a obține informații despre ea însăși. Java are clase speciale:  Field și Method , care sunt similare cu clasa Class pentru clase. Așa cum obiectele Class vă permit să obțineți informații despre o clasă, obiectele Field oferă informații despre un câmp , iar obiectul Method oferă informații despre o metodă. Și uitați-vă la ce puteți face cu ele:"

Cod Java Descriere
Class[] interfaces = List.class.getInterfaces();
Obține o listă de obiecte Class pentru interfețele clasei List
Class parent = String.class.getSuperclass();
Obține obiectul Class al clasei părinte a clasei String
Method[] methods = List.class.getMethods();
Obține o listă cu metodele clasei List
String s = String.class.newInstance();
Creează un șir nou
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Obține metoda lungimii clasei String și o apelează pe String s

"Wow! Acum e foarte tare!"