A getClass() metódus, a Class objektum és a Reflection bevezetése - 1

– Szia Amigo!

"Most eljött a fő esemény ideje. Megismerkedünk a Class osztállyal, és érintjük a Reflectiont.
Mint valószínűleg már rájöttél, a Java-ban minden egy objektum. És mi kell egy objektumnak? Mit határoz meg az egyes objektumok miről van szó?"

"Osztály!"

"Rendben! Jól van. Minden objektumnak van egy osztálya. De visszatérve az objektumokhoz... Egyes objektumok teljesen tartalmaznak egy entitást, míg mások egyszerűen segítenek kezelni."

"Ez utóbbi típusba tartozik a FileOutputStream és a Thread . Thread objektum létrehozásakor új szál nem jön létre. A szálat a Java virtuális gép hozza létre a start() metódus meghívása után. Ez az objektum egyszerűen segít a folyamat kezelésében."

"Ugyanez a FileOutputStream esetében : a fájl lemezen van tárolva, az operációs rendszer pedig kezeli a tárolást és a hozzáférést. De a fájlobjektumokon keresztül tudunk vele kommunikálni, ismét a Java virtuális gép segítségével."

– Igen, ezt már értem.

"Szóval, van egy speciális osztály, az osztály az osztályokkal való interakcióra."

– Nem volt nehéz kitalálni.

"Igen. Valahányszor a Java virtuális gép új osztályt tölt be a memóriába, létrehoz egy Class objektumot, amellyel konkrét információkat kaphat a betöltött osztályról."

"Minden osztály és objektum egy « Osztály objektumhoz » van társítva .

Példa Leírás
Class clazz = Integer.class;
Lekéri az Integer osztály Class objektumát.
Class clazz = int.class;
Lekéri az int osztály Class objektumát.
Class clazz = "123".getClass();
Lekéri egy String objektum Class objektumát.
Class clazz = new Object().getClass();
Lekéri az Object objektum Class objektumát.

"Hűha! Milyen érdekes!"

"Emlékszel, hogy a class szó kulcsszó a Java nyelvben, és nem használható változónévként?"

"Ó igen, tudom, tudom. Csak elfelejtettem."

– Használtad már valahol a Class objektumot?

"Igen, ezt használtuk, amikor megírtuk az egyenlőség módszer saját megvalósítását."

"Igen, a getClass() metódussal ellenőrizheti, hogy az objektumok azonos osztályúak-e."

– És mit lehet kezdeni ezzel a tárggyal?

– Nos, sok minden:

Java kód Leírás
Class s = int.class;
String name = s.getName();
Lekéri az osztály nevét.
Class s = Class.forName("java.lang.String");
Név szerint kap egy osztályt.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Összehasonlítja az objektumok osztályait.

– Érdekes, de nem olyan menő, mint gondoltam.

"Azt akarod, hogy menő legyen? Van Reflection is .  A tükrözés szuper jó."

– Mi az a Reflexió ?

" A reflexió egy osztály azon képessége, hogy információkat szerezzen önmagáról. A Java speciális osztályokkal rendelkezik:  Field és Method , amelyek hasonlóak az osztályok Class osztályához . Ahogyan az osztályobjektumok lehetővé teszik az osztályok információinak megszerzését, a mezőobjektumok egy mezőről nyújtanak információt. , és a Method objektum információkat nyújt egy metódusról. És nézze meg, mit tehet velük:"

Java kód Leírás
Class[] interfaces = List.class.getInterfaces();
Lekéri az Osztály objektumok listáját a Lista osztály interfészeihez
Class parent = String.class.getSuperclass();
Lekéri a String osztály szülőosztályának Class objektumát
Method[] methods = List.class.getMethods();
Lekéri a List osztály metódusainak listáját
String s = String.class.newInstance();
Létrehoz egy új karakterláncot
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Lekéri a String osztály hosszmetódusát, és meghívja a String s-en

"Hűha! Ez most nagyon klassz!"