Java Reflektion är en process för att undersöka eller ändra körtidsbeteendet för en klass vid körning .
De java.lang.Class class tillhandahåller många metoder som kan användas för att hämta metadata, undersöka och ändra körtidsbeteendet för en klass.
Paketen java.lang och java.lang.reflect tillhandahåller klasser för java-reflektion.
konvertera char till sträng
Där den används
Reflection API används huvudsakligen i:
- IDE (Integrated Development Environment) t.ex. Eclipse, MyEclipse, NetBeans etc.
- Debugger
- Testverktyg etc.
- På hur många sätt kan vi få instansen av klassklass?
- Hur skapar man javap-verktyget?
- Hur skapar man appletviewer-verktyget?
- Hur får man tillgång till den privata metoden utanför klassen?
java.lang.Klassklass
Klassen java.lang.Class utför huvudsakligen två uppgifter:
- tillhandahåller metoder för att få metadata för en klass vid körning.
- tillhandahåller metoder för att undersöka och ändra körtidsbeteendet för en klass.
Vanligt använda metoder för klassklass:
Metod | Beskrivning |
---|---|
1) public String getName() | returnerar klassnamnet |
2) public static Class forName(String className) kastar ClassNotFoundException | laddar klassen och returnerar referensen till klassklassen. |
3) public Object newInstance() kastar InstantiationException,IllegalAccessException | skapar en ny instans. |
4) public boolean isInterface() | kontrollerar om det är gränssnitt. |
5 ) public boolean isArray ( ) ; | kontrollerar om det är array. |
6) public boolean isPrimitive() | kontrollerar om det är primitivt. |
7) offentlig klass getSuperclass() | returnerar superklassklassreferensen. |
8) public Field[] getDeclaredFields() kastar SecurityException | returnerar det totala antalet fält i denna klass. |
9) public Method[] getDeclaredMethods() kastar SecurityException | returnerar det totala antalet metoder för denna klass. |
10) public Constructor[] getDeclaredConstructors() kastar SecurityException | returnerar det totala antalet konstruktörer för denna klass. |
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException | returnerar metodklassinstansen. |
Hur får man objektet i klassklassen?
Det finns tre sätt att få instansen av klassklass. De är följande:
- forName()-metoden för klassklassen
- getClass()-metoden för objektklassen
- .class-syntaxen
1) metoden forName() för klassklassen
- används för att ladda klassen dynamiskt.
- returnerar instansen av klassklassen.
- Det bör användas om du känner till det fullständiga namnet på klassen. Detta kan inte användas för primitiva typer.
Låt oss se det enkla exemplet på metoden forName().
Filnamn: Test.java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Produktion:
Simple
2) getClass()-metoden för objektklassen
Den returnerar instansen av klassklassen. Den bör användas om du känner till typen. Dessutom kan den användas med primitiver.
java annat
Filnamn: 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); } }
Produktion:
Simple
3) .class-syntaxen
Om en typ är tillgänglig, men det inte finns någon instans, är det möjligt att få en klass genom att lägga till '.class' till typens namn. Den kan också användas för primitiva datatyper.
Filnamn: 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()); } }
Produktion:
boolean Test
Bestämma klassobjektet
Följande metoder för klassklass används för att bestämma klassobjektet:
1) public boolean isInterface(): avgör om det angivna Class-objektet representerar en gränssnittstyp.
kat timpf syster
2 ) public boolean isArray ( ) ; avgör om detta Class-objekt representerar en arrayklass.
3) public boolean isPrimitive(): avgör om det angivna klassobjektet representerar en primitiv typ.
Låt oss se det enkla exemplet på reflektions-API för att bestämma objekttypen.
Filnamn: 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);} } }
Produktion:
fmovies Indien
false true
För- och nackdelar med reflektion
Java-reflektion bör alltid användas med försiktighet. Även om reflektionen ger många fördelar, har den också några nackdelar. Låt oss diskutera fördelarna först.
Fördelar: Inspektion av gränssnitt, klasser, metoder och fält under körning är möjlig med reflektion, även utan att använda deras namn under kompileringstiden. Det är också möjligt att anropa metoder, instansiera en clear eller att ställa in värdet på fält med hjälp av reflektion. Det hjälper till att skapa visuella utvecklingsmiljöer och klasswebbläsare som hjälper utvecklarna att skriva rätt kod.
Nackdelar: Med hjälp av reflektion kan man bryta principerna för inkapsling. Det är möjligt att komma åt de privata metoderna och fälten i en klass med hjälp av reflektion. Således kan reflektion läcka ut viktig data till omvärlden, vilket är farligt. Till exempel, om man får åtkomst till de privata medlemmarna i en klass och ställer in ett nullvärde för det, kan den andra användaren av samma klass få NullReferenceException, och detta beteende förväntas inte.
En annan nackdel är omkostnader i prestanda. Eftersom typerna i reflektion löses dynamiskt kan JVM (Java Virtual Machine)-optimering inte ske. Därför är operationerna som utförs av reflektioner vanligtvis långsamma.
Slutsats
På grund av de ovan nämnda nackdelarna är det i allmänhet tillrådligt att undvika att använda reflektion. Det är en avancerad funktion som endast bör användas av programmerare eller utvecklare som har goda kunskaper i språkets grunder. Glöm aldrig! Närhelst reflektion används, äventyras applikationens säkerhet.
Nästa ämnen i Reflection API Tutorial
metoden newInstance().Förstå javap-verktyget
skapa javap-verktyg
skapa appletviewer-verktyg
Ring privat metod från en annan klass