java reflection tutorial with examples
Deze video-tutorial legt uit wat Reflection is en hoe je het kunt implementeren met behulp van Reflection API:
Reflectie in Java is het inspecteren en veranderen van het gedrag van een programma tijdens runtime.
Met behulp van deze reflectie-API kunt u klassen, constructeurs, modificatoren, velden, methoden en interfaces tijdens runtime inspecteren. Bijvoorbeeld, je kunt de naam van de klas opvragen of je kunt details krijgen van de privéleden van de klas.
Lees onze hele JAVA-trainingsserie voor meer inzicht in Java-concepten.
Hier is een video-zelfstudie over Java-reflectie:
Wat je leert:
Reflectie in Java
We zijn ons ervan bewust dat we in een bepaalde klasse de eigenschappen en methoden kunnen wijzigen tijdens het compileren, en dat is heel gemakkelijk te doen. Of de eigenschappen en methoden nu anoniem zijn of namen hebben, ze kunnen tijdens het compileren naar onze wil worden gewijzigd.
Maar we kunnen deze klassen, methoden of velden niet tijdens runtime on the fly wijzigen. Met andere woorden, het is erg moeilijk om het gedrag van verschillende programmeercomponenten tijdens runtime te veranderen, vooral voor onbekende objecten.
De programmeertaal Java biedt een functie met de naam 'Reflectie' waarmee we het runtime-gedrag van een klasse, veld of methode tijdens runtime kunnen wijzigen.
Dus een reflectie kan worden gedefinieerd als een “Techniek voor het inspecteren en wijzigen van het runtime-gedrag van een onbekend object tijdens runtime. Een object kan een klasse, een veld of een methode zijn. '
Reflection is een 'Application Programming Interface' (API) die wordt aangeboden door Java.
Het 'reflectie' -proces wordt hieronder weergegeven.
In de bovenstaande weergave kunnen we zien dat we een onbekend object hebben. Vervolgens gebruiken we de Reflection API op dit object. Als gevolg hiervan kunnen we het gedrag van dit object tijdens runtime wijzigen.
We kunnen dus Reflection API in onze programma's gebruiken om het gedrag van het object te wijzigen. De objecten kunnen van alles zijn, zoals methoden, interfaces, klassen, enz. We inspecteren deze objecten en veranderen hun gedrag tijdens runtime met behulp van de reflectie-API.
In Java zijn de 'java.lang' en 'java.lang.reflect' de twee pakketten die klassen ter reflectie bieden. De speciale klasse 'java.lang.Class' biedt de methoden en eigenschappen om metadata te extraheren waarmee we het klassegedrag kunnen inspecteren en wijzigen.
We gebruiken Reflection API die door de bovenstaande pakketten wordt geleverd om de klasse en zijn leden tijdens runtime te wijzigen, inclusief velden, methoden, constructeurs, enz. Een onderscheidend kenmerk van Reflection API is dat we ook de privégegevensleden of methoden van de klas kunnen manipuleren.
De Reflection API wordt voornamelijk gebruikt in:
- Reflectie wordt voornamelijk gebruikt in debugging-tools, JUnit en frameworks om het gedrag tijdens runtime te inspecteren en te veranderen.
- IDE (Integrated Development Environment) Bijv. Eclipse IDE, NetBeans, enz.
- Testgereedschap etc.
- Het wordt gebruikt als uw toepassing bibliotheken van derden heeft en als u meer wilt weten over de beschikbare klassen en methoden.
Reflection API in Java
Met behulp van Reflection API kunnen we de reflectie op de volgende entiteiten implementeren:
- Veld : De klasse Field heeft informatie die we gebruiken om een variabele of een veld te declareren, zoals een datatype (int, double, String, etc.), access modifier (private, public, protected, etc.), naam (identifier) en waarde.
- Methode : De Method-klasse kan ons helpen informatie te extraheren, zoals de toegangsmodificator van de methode, het retourneringstype van de methode, de naam van de methode, de typen methodeparameters en de uitzonderingstypes die door de methode zijn opgewekt.
- Bouwer : Constructorklasse geeft informatie over de klasseconstructor die constructortoegangsmodificator, constructornaam en parametertypes omvat.
- Bewerken : Modifier-klasse geeft ons informatie over een specifieke toegangsmodificator.
Alle bovenstaande klassen maken deel uit van het pakket java.lang.reflect. Vervolgens zullen we elk van deze klassen bespreken en programmeervoorbeelden gebruiken om de reflectie op deze klassen te demonstreren.
Laten we beginnen met de klasse java.lang.Class.
java.lang.Class Klasse
De klasse java.lang.De klasse bevat alle informatie en gegevens over klassen en objecten tijdens runtime. Dit is de belangrijkste klasse die wordt gebruikt voor reflectie.
De klasse java.lang.Class biedt:
- Methoden om metagegevens van klassen tijdens runtime op te halen.
- Methoden om het gedrag van een klasse tijdens runtime te inspecteren en te wijzigen.
Maak java.lang.Class-objecten
We kunnen objecten van java.lang.Class maken met behulp van een van de volgende opties.
youtube naar mp3 converter met afbeelding
# 1) .class-extensie
De eerste optie om een object van Class te maken, is door de extensie .class te gebruiken.
Bijvoorbeeld,als Test een klasse is, kunnen we als volgt een Class-object maken:
Dan kunnen we de obj_test gebruiken om reflectie uit te voeren, aangezien dit object alle informatie over de klasse Test heeft.
# 2) forName () methode
forName () methode neemt de naam van de klasse als argument en retourneert het Class-object.
Bijvoorbeeld,het object van de klasse Test kan als volgt worden gemaakt:
# 3) getClas () - methode
De methode getClass () gebruikt een object van een klasse om het object java.lang.Class op te halen.
Bijvoorbeeld,overweeg het volgende stuk code:
In de eerste regel hebben we een object van de testklasse gemaakt. Met behulp van dit object hebben we de methode 'getClass ()' aangeroepen om een object obj_test van java.lang.Class op te halen.
Krijg Super Class & Access Modifiers
java.lang.class biedt een methode “getSuperClass ()” die wordt gebruikt om de superklasse van een willekeurige klasse op te halen.
Evenzo biedt het een methode getModifier () die de toegangsmodificator van de klasse retourneert.
Het onderstaande voorbeeld laat de methode getSuperClass () zien.
Uitvoer
In het bovenstaande programmeervoorbeeld wordt een interface Persoon gedefinieerd met een eenzame methode ‘display ()’. Vervolgens definiëren we een studentenklasse die de persoonsinterface implementeert. In de hoofdmethode gebruiken we de methode getClass () om het Class-object op te halen en vervolgens toegang te krijgen tot de bovenliggende of superklasse van het Student-object met behulp van de methode getSuperClass ().
Krijg interfaces
Als de klasse een aantal interfaces implementeert, kunnen we deze interfacenamen ophalen met behulp van de methode getInterfaces () van de java.lang.Class. Hiervoor moeten we een reflectie uitvoeren op de Java-klasse.
Het onderstaande programmeervoorbeeld toont het gebruik van de methode getInterfaces () in Java Reflection
Uitvoer
In het bovenstaande programma hebben we twee interfaces gedefinieerd, namelijk Animals en PetAnimals. Vervolgens definiëren we een klasse Dog, die beide interfaces implementeert.
In de hoofdmethode halen we het object van de klasse Dog op in java.lang.Class om reflectie uit te voeren. Vervolgens gebruiken we de methode getInterfaces () om de interfaces op te halen die zijn geïmplementeerd door de klasse Dog.
Verwerking: Veldwaarde ophalen
Zoals eerder vermeld, biedt het pakket java.lang.reflect de klasse Field die ons helpt om het veld of de gegevensleden van de klasse weer te geven.
Hieronder worden de methoden vermeld die worden geboden door de klasse Field voor reflectie van een veld.
Methode | Omschrijving |
---|---|
getField ('fieldName') | Retourneert het veld (openbaar) met een opgegeven veldnaam. |
getFields () | Retourneert alle openbare velden (zowel voor klasse als superklasse). |
getDeclaredFields () | Haalt alle velden van de klasse op. |
getModifier () | Geeft als resultaat een gehele weergave van de toegangsmodificator van het veld. |
set (classObject, waarde) | Wijst de opgegeven waarde toe aan het veld. |
get (classObject) | Haalt veldwaarde op. |
setAccessible (boolean) | Maak privéveld toegankelijk door waar te geven. |
getDeclaredField ('fieldName') | Retourneert het veld met een opgegeven naam. |
Hieronder staan twee reflectievoorbeelden die de reflectie op het publieke en private veld demonstreren.
Het onderstaande Java-programma demonstreert de reflectie op een openbaar veld.
Uitvoer
In dit programma hebben we een klasse 'Student' verklaard met een openbaar veld StudentName. Vervolgens gebruiken we de API-interface van de klasse Field, reflecteren we op het veld StudentName en halen de toegangsmodificator en waarde op.
Het volgende programma geeft reflectie op een privéveld van de klas. De bewerkingen zijn vergelijkbaar, behalve dat er één extra functieaanroep is gedaan voor het privéveld. We moeten setAccessible (true) aanroepen voor het privéveld. Vervolgens doen we reflectie op dit veld op dezelfde manier als het publieke veld.
Uitvoer
Reflectie: methode
Net als bij de velden van de klas, kunnen we ook reflecteren op klassemethoden en hun gedrag tijdens runtime aanpassen. Hiervoor gebruiken we de Method-klasse van het pakket java.lang.reflect.
Hieronder staan de functies vermeld die worden geboden door de klasse Method voor reflectie van de klassemethode.
Methode | Omschrijving |
---|---|
getMethods () | Haalt alle openbare methoden op die zijn gedefinieerd in de klasse en de superklasse. |
getDeclaredMethod () | Retourneert methoden die in de klasse zijn gedeclareerd. |
getName () | Retourneert de namen van de methoden. |
getModifiers () | Retourneert een gehele weergave van de toegangsmodificator van de methode. |
getReturnType () | Retourneert het retourtype van de methode. |
Het onderstaande voorbeeld toont de weerspiegeling van klassemethoden in Java met behulp van de bovenstaande API's.
Uitvoer
In het bovenstaande programma zien we dat de methode getDeclaredMethods de reeks methoden retourneert die door de klasse zijn gedeclareerd. Vervolgens doorlopen we deze array en geven de informatie van elke methode weer.
Reflectie: Constructor
We kunnen de klasse 'Constructor' van het pakket java.lang.reflect gebruiken om de constructors van een Java-klasse te inspecteren en te wijzigen.
De constructorklasse biedt hiervoor de volgende methoden.
Methode | Omschrijving |
---|---|
getConstructors () | Retourneert alle constructors die zijn gedeclareerd in de klasse en de superklasse. |
getDeclaredConstructor () | Retourneert alle gedeclareerde constructors. |
getName () | Haalt de naam van de constructor op. |
getModifiers () | Retourneert de gehele weergave van de toegangsmodificator van constructors. |
getParameterCount () | Retourneert het totale aantal parameters voor een constructor. |
Het onderstaande reflectievoorbeeld toont de reflectie van constructors van een klasse in Java. Net als bij methode-reflectie, retourneert ook hier de methode getDeclaredConstructors een reeks constructors voor een klasse. Vervolgens doorlopen we deze constructorarray om informatie over elke constructor weer te geven.
Uitvoer
Nadelen van reflectie
Reflectie is krachtig, maar mag niet zonder onderscheid worden gebruikt. Als het mogelijk is om zonder reflectie te werken, is het beter om het niet te gebruiken.
Hieronder worden enkele nadelen van Reflection genoemd:
- Prestaties overhead: Hoewel reflectie een krachtig kenmerk is, presteren reflecterende bewerkingen nog steeds trager dan niet-reflecterende bewerkingen. Daarom moeten we reflecties vermijden in prestatiekritische applicaties.
- Beveiligingsbeperkingen: Omdat reflectie een runtime-functie is, zijn mogelijk runtime-machtigingen vereist. Dus voor de toepassingen die vereisen dat de code wordt uitgevoerd in een beperkte beveiligingsomgeving, heeft reflectie misschien geen zin.
- Blootstelling van interne onderdelen: Door reflectie te gebruiken, krijgen we toegang tot privévelden en methoden in een klas. Reflectie doorbreekt dus abstractie die code onportabel en disfunctioneel zou kunnen maken.
Veel Gestelde Vragen
V # 1) Waarom wordt Reflection gebruikt in Java?
Antwoord: Met behulp van reflectie kunnen we klassen, interfaces, constructors, velden en methoden tijdens runtime inspecteren, zelfs als ze anoniem zijn tijdens het compileren. Met deze inspectie kunnen we het gedrag van deze entiteiten tijdens runtime wijzigen.
Q # 2) Waar wordt reflectie gebruikt?
Antwoord: Reflectie wordt gebruikt bij het schrijven van frameworks die samenwerken met door de gebruiker gedefinieerde klassen, waarbij de programmeur niet eens weet wat de klassen of andere entiteiten zullen zijn.
Q # 3) Is Java Reflection traag?
Antwoord: Ja, het is langzamer dan de niet-reflectiecode.
Q # 4) Is Java Reflection slecht?
Antwoord: In zekere zin wel. Allereerst verliezen we de veiligheid tijdens het compileren. Zonder veiligheid tijdens compileren kunnen we uitvoeringsfouten krijgen die van invloed kunnen zijn op eindgebruikers. Het zal ook moeilijk zijn om de fout op te sporen.
Q # 5) Hoe stop je een reflectie in Java?
Antwoord: We vermijden simpelweg het gebruik van reflectie door niet-reflectieoperaties te schrijven. Of misschien kunnen we enkele generieke mechanismen gebruiken, zoals een aangepaste validatie met reflectie.
Meer over Java Reflection
Het pakket java.lang.reflect heeft de klassen en interfaces om te reflecteren. En de java.lang.class kan worden gebruikt als een startpunt voor de reflectie.
Hoe de klasse-objecten te krijgen:
1. Als u een exemplaar van een object heeft,
klasse c = obj.getclass ();
2. Als je het type klas kent,
klasse c = type.getClass ();
3. Als u de naam van de klas kent,
Klasse c = Class.forName ('com.demo.Mydemoclass');
Hoe de klasleden te krijgen:
Klasleden zijn velden (klassevariabelen) en methoden.
- getFields () - Wordt gebruikt om alle velden op te halen behalve de privévelden.
- getDeclaredField () - Wordt gebruikt om de privévelden op te halen.
- getDeclaredFields () - Wordt gebruikt om de privé- en openbare velden op te halen.
- getMethods () - Gebruikt om alle methoden op te halen behalve de privémethoden.
- getDeclaredMethods () –Gebruikt om de publieke en private methoden te krijgen.
Demoprogramma's:
ReflectionHelper.java:
Dit is de klasse waarin we gaan inspecteren met behulp van de reflectie-API.
beste websites om gratis anime te kijken
ReflectionDemo.java
Gevolgtrekking
In deze tutorial werd de Reflection API in Java in detail uitgelegd. We hebben gezien hoe we klassen, interfaces, velden, methoden en constructors kunnen reflecteren, samen met een paar nadelen van reflectie.
Reflectie is een relatief geavanceerde functie in Java, maar moet worden gebruikt door programmeurs die de taal sterk beheersen. Dit komt omdat het onverwachte fouten en resultaten kan veroorzaken als het niet met de nodige voorzichtigheid wordt gebruikt.
Hoewel reflectie krachtig is, moet het zorgvuldig worden gebruikt. Desalniettemin kunnen we met behulp van reflectie applicaties ontwikkelen die tot runtime niet op de hoogte zijn van klassen en andere entiteiten.
Bekijk hier de Java-beginnershandleiding.
Aanbevolen literatuur
- Zelfstudie voor Java-scannerklassen met voorbeelden
- Java Integer en Java BigInteger Class met voorbeelden
- JAVA-zelfstudie voor beginners: 100+ praktische Java-videotutorials
- Inleiding tot de programmeertaal van Java - videozelfstudie
- Wat is Java-vector | Java Vector Class-zelfstudie met voorbeelden
- Java-interface en abstracte les met voorbeelden
- Java substring () -methode - zelfstudie met voorbeelden
- Zelfstudie voor Java Collections Framework (JCF)