De getClass() methode, het Class-object en een inleiding tot Reflection - 1

"Hallo Amigo!"

"Nu is het tijd voor het hoofdevenement. We zullen kennis maken met de Class-klasse en Reflectie bespreken.
Zoals je waarschijnlijk al besefte, is alles in Java een object. En wat heeft een object nodig? Wat heeft elk object dat definieert waar gaat het over?"

"Een klas!"

"Juist! Goed gedaan. Elk object heeft een klasse. Maar om terug te komen op objecten... Sommige objecten bevatten volledig een entiteit, terwijl andere eenvoudig helpen deze te beheren."

"Dit laatste type omvat FileOutputStream en Thread . Wanneer u een Thread- object maakt , wordt er geen nieuwe thread gemaakt. De thread wordt gemaakt door de virtuele Java-machine nadat de start()-methode is aangeroepen. Dit object helpt eenvoudig bij het beheren van het proces."

"Hetzelfde met FileOutputStream : het bestand wordt op schijf opgeslagen en het besturingssysteem beheert de opslag en toegang. Maar we kunnen ermee communiceren via File-objecten, opnieuw met behulp van de virtuele Java-machine."

"Ja, dat begrijp ik al."

"Er is dus een speciale klasse genaamd Class voor interactie met klassen."

"Dat was niet moeilijk te raden."

"Ja. Elke keer dat de virtuele Java-machine een nieuwe klasse in het geheugen laadt, maakt het een Class-object aan, dat je kunt gebruiken om specifieke informatie over de geladen klasse te krijgen."

"Elke klasse en elk object is gekoppeld aan een « Class-object »."

Voorbeeld Beschrijving
Class clazz = Integer.class;
Haalt het Class-object van de Integer-klasse op.
Class clazz = int.class;
Haalt het Class-object van de int-klasse op.
Class clazz = "123".getClass();
Haalt het Class-object van een String-object op.
Class clazz = new Object().getClass();
Haalt het Class-object van het Object-object op.

"Wauw! Wat interessant!"

"Weet je nog dat het woord class een sleutelwoord is in Java en niet als variabelenaam kan worden gebruikt?"

"Oh ja, ik weet het, ik weet het. Ik was het gewoon vergeten."

"Heb je het Class-object al ergens gebruikt?"

"Ja, we gebruikten het toen we onze eigen implementatie van de equals-methode schreven."

"Ja, u kunt de methode getClass() gebruiken om te testen of objecten dezelfde klasse hebben."

"En wat kun je met dit voorwerp doen?"

"Nou, een heleboel dingen:"

Java-code Beschrijving
Class s = int.class;
String name = s.getName();
Krijgt de klassenaam.
Class s = Class.forName("java.lang.String");
Krijgt een klas op naam.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Vergelijkt klassen van objecten.

"Interessant, maar niet zo cool als ik dacht."

"Wil je dat het cool is? Er is ook ReflectionReflection is supercool."

"Wat is reflectie ?"

" Reflectie is het vermogen van een klasse om informatie over zichzelf te verkrijgen. Java heeft speciale klassen:  Field en Method , die vergelijkbaar zijn met de klasse Class voor klassen. Net zoals Class -objecten u informatie over een klasse geven, geven Field-objecten informatie over een veld , en het Method-object geeft informatie over een methode. En kijk wat je ermee kunt doen:"

Java-code Beschrijving
Class[] interfaces = List.class.getInterfaces();
Krijgt een lijst met Class-objecten voor de interfaces van de List-klasse
Class parent = String.class.getSuperclass();
Haalt het Class-object op van de bovenliggende klasse van de String-klasse
Method[] methods = List.class.getMethods();
Krijgt een lijst met de methoden van de klasse List
String s = String.class.newInstance();
Maakt een nieuwe tekenreeks
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Haalt de lengtemethode van de String-klasse op en roept deze aan op de String s

"Wauw! Dat is pas echt gaaf!"