Java-reflectie is een proces waarbij het runtimegedrag van een klasse tijdens runtime wordt onderzocht of gewijzigd .
tekenreeks vervangt alle Java
De java.lang.Class class biedt vele methoden die kunnen worden gebruikt om metagegevens te verkrijgen en het runtimegedrag van een klasse te onderzoeken en te wijzigen.
De pakketten java.lang en java.lang.reflect bieden klassen voor Java-reflectie.
Waar het wordt gebruikt
De Reflection API wordt voornamelijk gebruikt bij:
- IDE (Integrated Development Environment), bijvoorbeeld Eclipse, MyEclipse, NetBeans enz.
- Debugger
- Testtools enz.
- Op hoeveel manieren kunnen we de instantie van de klasse Class krijgen?
- Hoe maak ik de Javap-tool?
- Hoe maak ik de appletviewer-tool?
- Hoe krijg ik toegang tot de privémethode van buiten de klas?
java.lang.Class klasse
De klasse java.lang.Class voert hoofdzakelijk twee taken uit:
- biedt methoden om de metagegevens van een klasse tijdens runtime op te halen.
- biedt methoden om het runtimegedrag van een klasse te onderzoeken en te wijzigen.
Veelgebruikte methoden voor klasseklasse:
Methode | Beschrijving |
---|---|
1) openbare tekenreeks getName() | retourneert de klassenaam |
2) openbare statische klasse forName(String className) gooit ClassNotFoundException | laadt de klasse en retourneert de referentie van de klasse klasse. |
3) openbaar object newInstance() gooit InstantiationException,IllegalAccessException | creëert een nieuw exemplaar. |
4) openbare boolean isInterface() | controleert of het een interface is. |
5) publieke boolean isArray(); | controleert of het een array is. |
6) openbare boolean isPrimitive() | controleert of het primitief is. |
7) openbare klasse getSuperclass() | retourneert de superklasseklassereferentie. |
8) public Field[] getDeclaredFields() gooit SecurityException | retourneert het totale aantal velden van deze klasse. |
9) public Method[] getDeclaredMethods() gooit SecurityException | retourneert het totale aantal methoden van deze klasse. |
10) public Constructor[] getDeclaredConstructors() gooit SecurityException | retourneert het totale aantal constructors van deze klasse. |
11) publieke methode getDeclaredMethod(String name,Class[] parameterTypes) gooit NoSuchMethodException,SecurityException | retourneert de instantie van de methodeklasse. |
Hoe krijg ik het object van de klasse Class?
Er zijn 3 manieren om de instantie van de klasse Class te verkrijgen. Ze zijn als volgt:
- forName() methode van klasse klasse
- getClass()-methode van de objectklasse
- de .class-syntaxis
1) forName() methode van klasse klasse
- wordt gebruikt om de klasse dynamisch te laden.
- retourneert de instantie van de klasse Class.
- Het moet worden gebruikt als u de volledig gekwalificeerde naam van de klasse kent. Dit kan niet worden gebruikt voor primitieve typen.
Laten we het eenvoudige voorbeeld van de methode forName() bekijken.
Bestandsnaam: Test.java
html-lijst
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Uitgang:
Simple
2) getClass()-methode van de Object-klasse
Het retourneert de instantie van de klasse Class. Het moet worden gebruikt als u het type kent. Bovendien kan het worden gebruikt met primitieven.
Bestandsnaam: Test.java
class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } }
Uitgang:
Simple
3) De .class-syntaxis
Als een type beschikbaar is, maar er is geen instance, dan is het mogelijk om een Klasse te verkrijgen door '.class' aan de naam van het type toe te voegen. Het kan ook worden gebruikt voor primitieve gegevenstypen.
Bestandsnaam: Test.java
class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } }
Uitgang:
uitzondering gooit java
boolean Test
Het klasseobject bepalen
De volgende methoden van Class-klasse worden gebruikt om het klasseobject te bepalen:
1) publieke boolean isInterface(): bepaalt of het opgegeven Class-object een interfacetype vertegenwoordigt.
2) publieke boolean isArray(): bepaalt of dit Class-object een array-klasse vertegenwoordigt.
3) publieke boolean isPrimitive(): bepaalt of het opgegeven Class-object een primitief type vertegenwoordigt.
Laten we het eenvoudige voorbeeld van de reflectie-API bekijken om het objecttype te bepalen.
Bestandsnaam: Test.java
class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } }
Uitgang:
fabrieksontwerppatroon
false true
Voor- en nadelen van reflectie
Java-reflectie moet altijd met voorzichtigheid worden gebruikt. Hoewel de reflectie veel voordelen biedt, heeft deze ook enkele nadelen. Laten we eerst de voordelen bespreken.
Pluspunten: Inspectie van interfaces, klassen, methoden en velden tijdens runtime is mogelijk met behulp van reflectie, zelfs zonder hun namen te gebruiken tijdens het compileren. Het is ook mogelijk om methoden aan te roepen, een clear te instantiëren of de waarde van velden in te stellen met behulp van reflectie. Het helpt bij het creëren van visuele ontwikkelomgevingen en klassenbrowsers die de ontwikkelaars helpen de juiste code te schrijven.
Nadelen: Door reflectie te gebruiken, kan men de principes van inkapseling doorbreken. Het is mogelijk om via reflectie toegang te krijgen tot de privémethoden en velden van een klasse. Reflectie kan dus belangrijke gegevens naar de buitenwereld lekken, wat gevaarlijk is. Als iemand bijvoorbeeld toegang krijgt tot de privéleden van een klasse en er een nulwaarde aan instelt, kan de andere gebruiker van dezelfde klasse de NullReferenceException krijgen, en dit gedrag wordt niet verwacht.
Een ander minpunt is de overhead in de prestaties. Omdat de typen in reflectie dynamisch worden opgelost, kan JVM-optimalisatie (Java Virtual Machine) niet plaatsvinden. Daarom zijn de bewerkingen die door reflecties worden uitgevoerd gewoonlijk langzaam.
Conclusie
Vanwege de bovengenoemde nadelen is het over het algemeen raadzaam om het gebruik van reflectie te vermijden. Het is een geavanceerde functie die alleen mag worden gebruikt door programmeurs of ontwikkelaars die een goede kennis hebben van de basisprincipes van de taal. Onthoud altijd! Wanneer reflectie wordt gebruikt, komt de veiligheid van de applicatie in gevaar.
Volgende onderwerpen van de Reflection API-zelfstudie
newInstance()-methodeJavap-tool begrijpen
Javap-tool maken
appletviewer-tool maken
Roep de privémethode aan vanuit een andere klasse