Java Reflection API Beheersen: Een Praktische Gids met Codevoorbeelden
Wat Is Reflectie in Java?
Java Reflectie is het proces van analyseren en wijzigen van alle mogelijkheden van een klasse tijdens runtime. Reflection API in Java wordt gebruikt om een klasse en zijn leden – velden, methodes, constructors, etc. – tijdens runtime te manipuleren.
Een voordeel van reflection API in Java is dat het private leden van de klasse kan manipuleren.
Het java.lang.reflect pakket biedt veel klassen om reflectie te implementeren. Methodes van de java.lang.Class klasse worden gebruikt om de complete metadata van een specifieke klasse te verzamelen.
In deze tutorial leer je:
- Wat is Reflectie
- Klassen in java.lang.reflect Pakket
- Methodes gebruikt in java.lang.Class
- Hoe complete informatie over een klasse te krijgen
- Voorbeeld 1: Metadata van Klasse ophalen
- Voorbeeld 2: Metadata van Variabele ophalen
- Voorbeeld 3: Metadata van Methode ophalen
- Voorbeeld 4: Metadata van Constructors ophalen
Klassen in java.lang.reflect Pakket
Hier is een lijst van diverse Java klassen in java.lang.package voor reflectie:
- Field: Deze klasse wordt gebruikt om declaratieve informatie te verzamelen zoals datatype, access modifier, naam en waarde van een variabele.
- Method: Deze klasse wordt gebruikt om declaratieve informatie te verzamelen zoals access modifier, return type, naam, parameter types en exception type van een methode.
- Constructor: Deze klasse wordt gebruikt om declaratieve informatie te verzamelen zoals access modifier, naam en parameter types van een constructor.
- Modifier: Deze klasse wordt gebruikt om informatie over een bepaalde access modifier te verzamelen.
Methodes Gebruikt in java.lang.Class
- Public String getName(): Retourneert de naam van de klasse.
- public Class getSuperclass(): Retourneert de super klasse referentie.
- Public Class[] getInterfaces(): Retourneert een array van interfaces geïmplementeerd door de gespecificeerde klasse.
- Public int getModifiers(): Retourneert een integer waarde die de modifiers van de gespecificeerde klasse vertegenwoordigt, wat doorgegeven moet worden als parameter aan public static String toString(int i) methode wat de access specifier retourneert voor de gegeven klasse.
Hoe Complete Informatie Over Een Klasse Te Krijgen
Om informatie over variabelen, methodes en constructors van een klasse te krijgen, moeten we een object van de klasse aanmaken.

public class Guru99ClassObjectCreation {
public static void main (String[] args) throws ClassNotFoundException {
//1 - Door Class.forname() methode te gebruiken
Class c1 = Class.forName("Guru99ClassObjectCreation");
//2- Door getClass() methode te gebruiken
Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();
Class c2 = guru99Obj.getClass();
//3- Door .class te gebruiken
Class c3 = Guru99ClassObjectCreation.class;
}
}
Volgend voorbeeld toont verschillende manieren om object van klasse "class" te creëren:
Voorbeeld 1: Hoe Metadata Van Klasse Te Krijgen
Volgend voorbeeld toont hoe metadata op te halen zoals: Klassenaam, super klasse naam, geïmplementeerde interfaces, en access modifiers van een klasse.
We halen de metadata op van onderstaande klasse genaamd Guru99Base.class:

import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- Naam van de klasse is: Guru99Base
- Zijn access modifiers zijn: public en abstract
- Het heeft geïmplementeerde interfaces: Serializable en Cloneable
- Omdat het geen klasse expliciet extend, is zijn super klasse: java.lang.Object
Onderstaande klasse haalt de metadata van Guru99Base.class op en print het:

import java.lang.reflect.Modifier;
public class Guru99GetclassMetaData {
public static void main (String[] args) throws ClassNotFoundException {
// Creëer Class object voor Guru99Base.class
Class<Guru99Base> guru99ClassObj = Guru99Base.class;
// Print naam van de klasse
System.out.println("Naam van de klasse is : " + guru99ClassObj.getName());
// Print Super klasse naam
System.out.println("Naam van de super klasse is : " + guru99ClassObj.getSuperclass().getName());
// Krijg lijst van geïmplementeerde interfaces als Class array via getInterface() methode
Class[] guru99InterfaceList = guru99ClassObj.getInterfaces();
// Print geïmplementeerde interfaces met foreach loop
System.out.print("Geïmplementeerde interfaces zijn : ");
for (Class guru99class1 : guru99InterfaceList) {
System.out.print(guru99class1.getName() + " ");
}
System.out.println();
// Krijg access modifiers via getModifiers() en toString() methode van java.lang.reflect.Modifier klasse
int guru99AccessModifier = guru99ClassObj.getModifiers();
// Print de access modifiers
System.out.println("Access modifiers van de klasse zijn : " + Modifier.toString(guru99AccessModifier));
}
}
- Print de naam van de klasse met getName methode
- Print de naam van de super klasse met getSuperClass().getName() methode
- Print de namen van de geïmplementeerde interfaces
- Print de access modifiers gebruikt door de klasse


Voorbeeld 2: Hoe Metadata Van Variabele Te Krijgen
Volgende voorbeelden tonen hoe metadata van variabele op te halen:
Hier creëren we een klasse genaamd Guru99VariableMetaData.class met enkele variabelen:
package guru;
public class Guru99VariableMetaData {
public static int guru99IntVar1 = 1111;
static int guru99IntVar2 = 2222;
static String guru99StringVar1 = "guru99.com";
static String guru99StringVar2 = "Learning Reflection API";
}
Stappen om metadata over de variabelen in bovenstaande klasse te krijgen:
- Creëer het klasse object van bovenstaande klasse, namelijk Guru99VariableMetaData.class als volgt:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Krijg de metadata in vorm van field array met getFields() of getDeclaredFields() methodes:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
getFields() methode retourneert metadata van de public variabele van de gespecificeerde klasse en zijn super klasse.
getDeclaredFields() methode retourneert metadata van alle variabelen van de gespecificeerde klasse alleen.
- Krijg de naam van de variabelen met "public String getName()" methode.
- Krijg het datatype van de variabelen met "public Class getType()" methode.
- Krijg de waarde van de variabele met "public xxx get(Field)" methode. Hier kan xxx een byte of short of elk type waarde zijn die we willen ophalen.
- Krijg de access modifiers van de variabelen met getModifier() en Modifier.toString(int i) methodes.
Hier schrijven we een klasse om de metadata van de variabelen in de klasse Guru99VariableMetaData.class op te halen:

package guru;
import java.lang.reflect.Field;
public class Guru99VariableMetaDataTest {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
// Creëer Class object voor Guru99VariableMetaData.class
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();
Class guru99ClassObjVar = guru99ClassVar.getClass();
// Krijg metadata van alle velden van de klasse Guru99VariableMetaData
Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields();
// Print naam, datatypes, access modifiers en waarden van de variabelen van de gespecificeerde klasse
for (Field field : guru99Field1) {
System.out.println("Variabele naam : " + field.getName());
System.out.println("Datatypes van de variabele :" + field.getType());
int guru99AccessModifiers = field.getModifiers();
System.out.println("Access Modifiers van de variabele : " + Modifier.toString(guru99AccessModifiers));
System.out.println("Waarde van de variabele : " + field.get(guru99ClassVar));
System.out.println();
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *");
}
}
}
- Klasse object aangemaakt voor Guru99VariableMetaData.class
- Alle metadata van variabelen in een Field array opgehaald
- Alle variabelenamen geprint in klasse Guru99VariableMetaData.class
- Alle datatypes van variabelen geprint in klasse Guru99VariableMetaData.class
- Alle access modifiers van variabelen geprint in klasse Guru99VariableMetaData.class
- Waarden van alle variabelen geprint in Geprint alle datatypes van de variabelen in de klasse Guru99VariableMetaData.class


Voorbeeld 3: Hoe Metadata Van Methode Te Krijgen
Volgende voorbeelden tonen hoe metadata van een methode op te halen:
Hier creëren we een klasse genaamd Guru99MethodMetaData.class met enkele methodes

package guru;
import java.sql.SQLException;
public class Guru99MethodMetaData {
public void guru99Add(int firstElement, int secondElement, String result) throws ClassNotFoundException, ClassCastException {
System.out.println("Demo methode voor Reflection API");
}
public String guru99Search(String searchString) throws ArithmeticException, InterruptedException {
System.out.println("Demo methode voor Reflection API");
return null;
}
public void guru99Delete(String deleteString) throws SQLException {
System.out.println("Demo methode voor Reflection API");
}
}
Stappen om metadata over de methodes in bovenstaande klasse te krijgen:
- Creëer het klasse object van bovenstaande klasse, namelijk Guru99MethodMetaData.class:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Krijg methode informatie in een Method array met getMethods() en getDeclaredMethods():
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
getMethods() retourneert metadata van de public methodes van de gespecificeerde klasse en zijn super klasse.
getDeclaredMethods() retourneert metadata van alle methodes van de gespecificeerde klasse alleen.
- Krijg de naam van de methode met getName() methode.
- Krijg het return type van de methode met getReturnType() methode.
- Krijg access modifiers van de methodes met getModifiers() en Modifier.toString(int i) methodes.
- Krijg methode parameter types met getParameterTypes() wat een Class array retourneert.
- Krijg gegooide exceptions met getExceptionTypes() wat een Class array retourneert.
Hier schrijven we een klasse om de metadata van de methodes in de klasse Guru99MethodMetaData.class op te halen:

package guru;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Guru99MethodMetaDataTest {
public static void main(String[] args) {
// Creëer Class object voor Guru99MethodMetaData.class
Class guru99ClassObj = Guru99MethodMetaData.class;
// Krijg metadata van alle methodes van de klasse met getDeclaredMethods()
Method[] guru99Methods = guru99ClassObj.getDeclaredMethods();
for (Method method : guru99Methods) {
// Print methode namen
System.out.println("Naam van de methode : " + method.getName());
// Print return type van de methodes
System.out.println("Return type van de methode : " + method.getReturnType());
// Krijg access modifier lijst en print
int guru99ModifierList = method.getModifiers();
System.out.println("Methode access modifiers : " + Modifier.toString(guru99ModifierList));
// Krijg en print parameters van de methodes
Class[] guru99ParamList = method.getParameterTypes();
System.out.print("Methode parameter types : ");
for (Class class1 : guru99ParamList) {
System.out.println(class1.getName() + " ");
}
System.out.println();
// Krijg en print exceptions gegooid door de methode
Class[] guru99ExceptionList = method.getExceptionTypes();
System.out.print("Exception gegooid door methode : ");
for (Class class1 : guru99ExceptionList) {
System.out.println(class1.getName() + " ");
}
System.out.println();
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *");
}
}
}
- Klasse object aangemaakt voor Guru99MethodMetaData.class
- Alle metadata van methodes in een Method array opgehaald
- Alle methode namen geprint in klasse Guru99MethodMetaData.class
- Return types van methodes geprint in klasse Guru99MethodMetaData.class
- Alle access modifiers van methodes geprint in klasse Guru99MethodMetaData.class
- Parameter types van methodes geprint in Guru99MethodMetaData.class
- Exceptions gegooid door methodes geprint in Guru99MethodMetaData.class

Voorbeeld 4: Hoe Metadata Van Constructors Te Krijgen
Volgende voorbeelden tonen hoe metadata van constructors op te halen:
Hier creëren we een klasse genaamd Guru99Constructor.class met verschillende constructors:

package guru;
import java.rmi.RemoteException;
import java.sql.SQLException;
public class Guru99Constructor {
public Guru99Constructor(int no) throws ClassCastException, ArithmeticException {
}
public Guru99Constructor(int no, String name) throws RemoteException, SQLException {
}
public Guru99Constructor(int no, String name, String address) throws InterruptedException {
}
}
Hier schrijven we een klasse om de metadata van de constructors in de klasse Guru99Constructor.class op te halen:

package guru;
import java.lang.reflect.Constructor;
public class Guru99ConstructorMetaDataTest {
public static void main(String[] args) {
// Creëer Class object voor Guru99Constructor.class
Class guru99Class = Guru99Constructor.class;
// Krijg alle constructor informatie in Constructor array
Constructor[] guru99ConstructorList = guru99Class.getConstructors();
for (Constructor constructor : guru99ConstructorList) {
// Print namen van elke constructor
System.out.println("Constructor naam : " + constructor.getName());
// Krijg en print access modifiers
int guru99Modifiers = constructor.getModifiers();
System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers));
// Krijg en print parameter types
Class[] guru99ParamList = constructor.getParameterTypes();
System.out.print("Constructor parameter types : ");
for (Class class1 : guru99ParamList) {
System.out.println(class1.getName() + " ");
}
System.out.println();
// Krijg en print exceptions gegooid door constructors
Class[] guru99ExceptionList = constructor.getExceptionTypes();
System.out.println("Exception gegooid door constructors : ");
for (Class class1 : guru99ExceptionList) {
System.out.println(class1.getName() + " ");
}
System.out.println();
System.out.println("*******************************************");
}
}
}
- Klasse object aangemaakt voor Guru99Constructor.class
- Alle metadata van constructors in een Constructor array opgehaald
- Alle constructor namen geprint in klasse Guru99Constructor.class
- Alle access modifiers van constructors geprint in klasse Guru99Constructor.class
- Parameter types van constructors geprint in Guru99Constructor.class
- Exceptions gegooid door constructors geprint in Guru99Constructor.class


Samenvatting:
- Reflectie programmeren in Java helpt bij het ophalen en wijzigen van informatie over Klassen en Klasse leden zoals variabelen, methodes, constructors.
- Reflection API in Java kan geïmplementeerd worden met klassen in java.lang.reflect pakket en methodes van java.lang.Class klasse.
- Veelgebruikte methodes van java.lang.Class klasse zijn getName(), getSuperclass(), getInterfaces(), getModifiers() etc.
- Veelgebruikte klassen in java.lang.reflect pakket zijn Field, Method, Constructor, Modifier, etc.
- Reflection API kan private methodes en variabelen van een klasse benaderen wat een beveiligingsrisico kan zijn.
- Reflection API is een krachtige mogelijkheid geboden door Java, maar heeft overhead zoals langzamere prestaties, beveiligingskwetsbaarheid en permissie issues. Daarom moet reflection API behandeld worden als laatste redmiddel voor een operatie uit te voeren.
Java
- C++ Classes & Objects: Praktische Handleiding met Code‑Voorbeelden
- C# Classes & Objects Beheersen: Een Praktische Tutorial met Real-World Voorbeelden
- C# Abstracte Classes: Een Praktische Tutorial met Codevoorbeelden
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Reflectie meesteren: klassen, methoden en velden inspecteren tijdens runtime
- Java ObjectInputStream: Uitgebreide gids voor deserialisatie
- Java ObjectOutputStream: Serialisatie, methoden en praktische voorbeelden
- Java String.charAt() begrijpen: Syntaxis, Retourtype, Exceptions en Praktisch Voorbeeld
- Java String.endsWith() beheersen: Controleren op String-suffixen met voorbeelden
- Bestanden Lezen in Java met BufferedReader – Een Praktische Gids met Voorbeelden
- Insertion Sort algoritme in Java: Duidelijk voorbeeld & stapsgewijze handleiding