Metoden getClass(), Class-objektet och en introduktion till Reflection - 1

"Hej, Amigo!"

"Nu är det dags för huvudevenemanget. Vi ska bekanta oss med klassen Class och beröra Reflection.
Som du säkert redan insett är allt i Java ett objekt. Och vad behöver ett objekt? Vad har varje objekt som definierar vad handlar det om?"

"En klass!"

"Rätt! Bra gjort. Varje objekt har en klass. Men att återgå till objekt... Vissa objekt innehåller helt och hållet en entitet, medan andra helt enkelt hjälper till att hantera den."

"Denna senare typen inkluderar FileOutputStream och Thread . När du skapar ett Thread- objekt skapas inte en ny tråd. Tråden skapas av den virtuella Java-maskinen efter att metoden start() har anropats. Detta objekt hjälper helt enkelt till att hantera processen."

"Samma med FileOutputStream : filen lagras på disk, och operativsystemet hanterar lagring och åtkomst. Men vi kan interagera med den genom filobjekt, återigen med hjälp av den virtuella Java-maskinen."

"Ja, det förstår jag redan."

"Så, det finns en speciell klass som heter Class för att interagera med klasser."

"Det var inte svårt att gissa."

"Japp. Varje gång den virtuella Java-maskinen laddar en ny klass i minnet, skapar den ett Class-objekt, som du kan använda för att få specifik information om den inlästa klassen."

"Varje klass och objekt är associerade med ett " Klassobjekt" .

Exempel Beskrivning
Class clazz = Integer.class;
Hämtar Integer-klassens Class-objekt.
Class clazz = int.class;
Hämtar int-klassens Class-objekt.
Class clazz = "123".getClass();
Hämtar ett String-objekts Class-objekt.
Class clazz = new Object().getClass();
Hämtar objektobjektets klassobjekt.

"Wow! Vad intressant!"

"Kommer du ihåg att ordklassen är ett nyckelord i Java och inte kan användas som ett variabelnamn?"

"Åh ja, jag vet, jag vet. Jag har bara glömt."

"Har du redan använt Class-objektet någonstans?"

"Ja, vi använde det när vi skrev vår egen implementering av equals-metoden."

"Ja, du kan använda metoden getClass() för att testa om objekt har samma klass."

"Och vad kan du göra med det här föremålet?"

"Tja, många saker:"

Java-kod Beskrivning
Class s = int.class;
String name = s.getName();
Får klassnamnet.
Class s = Class.forName("java.lang.String");
Får en klass vid namn.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Jämför objekts klasser.

"Intressant, men inte så coolt som jag trodde."

"Vill du att det ska vara coolt? Det finns också ReflectionReflection är supercoolt."

"Vad är Reflektion ?"

" Reflektion är en klasss förmåga att få information om sig själv. Java har speciella klasser:  Fält och Metod , som liknar klassklassen för klasser. Precis som med klassobjekt kan du få information om en klass, tillhandahåller fältobjekt information om ett fält , och Method-objektet ger information om en metod. Och titta på vad du kan göra med dem:"

Java-kod Beskrivning
Class[] interfaces = List.class.getInterfaces();
Hämtar en lista med klassobjekt för Listklassens gränssnitt
Class parent = String.class.getSuperclass();
Hämtar Class-objektet för String-klassens överordnade klass
Method[] methods = List.class.getMethods();
Får en lista över Listklassens metoder
String s = String.class.newInstance();
Skapar en ny sträng
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Hämtar String-klassens längdmetod och anropar den på String s

"Wow! Nu är det riktigt coolt!"