logo

Java Reflection API

Java tükrözés egy egy osztály futási idejű viselkedésének vizsgálata vagy módosítása futási időben .

A java.lang.Class osztály számos metódust kínál, amelyek segítségével metaadatok beszerzésére, egy osztály futásidejű viselkedésének vizsgálatára és megváltoztatására használható.

A java.lang és a java.lang.reflect csomagok osztályokat biztosítanak a java tükrözéshez.

Hol használják

A Reflection API-t főként a következőkben használják:

  • IDE (Integrated Development Environment), például Eclipse, MyEclipse, NetBeans stb.
  • Hibakereső
  • Teszteszközök stb.
Tudod?
  • Hányféleképpen kaphatjuk meg a Class osztály példányát?
  • Hogyan lehet létrehozni a javap eszközt?
  • Hogyan lehet létrehozni az appletviewer eszközt?
  • Hogyan lehet elérni a privát metódust az osztályon kívülről?

java.lang.Class class

A java.lang.Class osztály főleg két feladatot lát el:

  • módszereket biztosít egy osztály metaadatainak futási időben történő lekéréséhez.
  • módszereket biztosít egy osztály futásidejű viselkedésének vizsgálatára és megváltoztatására.

A Class osztály általánosan használt metódusai:

MódszerLeírás
1) nyilvános karakterlánc getName()visszaadja az osztály nevét
2) nyilvános statikus Class forName(String className) ClassNotFoundException kivételt dobbetölti az osztályt, és visszaadja az osztály osztály hivatkozását.
3) nyilvános objektum newInstance() dobja InstantiationException, IllegalAccessExceptionúj példányt hoz létre.
4) publikus logikai isInterface()ellenőrzi, hogy interfész-e.
5) publikus logikai isArray ();ellenőrzi, hogy tömb-e.
6) nyilvános logikai isPrimitive()ellenőrzi, hogy primitív-e.
7) nyilvános osztály getSuperclass()visszaadja a szuperosztály osztályhivatkozást.
8) A public Field[] getDeclaredFields() biztonsági kivételt dobaz osztály mezőinek teljes számát adja vissza.
9) public Method[] getDeclaredMethods() dobja a SecurityException-taz osztály metódusainak teljes számát adja vissza.
10) public Constructor[] getDeclaredConstructors()dobja a SecurityException-taz osztály konstruktorainak teljes számát adja vissza.
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)dobja a NoSuchMethodException,SecurityExceptiona metódus osztály példányát adja vissza.

Hogyan lehet megszerezni a Class osztály objektumát?

A Class osztály példányának beszerzésének három módja van. Ezek a következők:

  • A Class osztály forName() metódusa
  • Az Object osztály getClass() metódusa
  • az .class szintaxis

1) a Class osztály forName() metódusa

  • az osztály dinamikus betöltésére szolgál.
  • a Class osztály példányát adja vissza.
  • Akkor kell használni, ha ismeri az osztály teljes képzésű nevét. Ez nem használható primitív típusokhoz.

Lássuk a forName() metódus egyszerű példáját.

konvertáljon egy karakterláncot dátummá

Fájl név: 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()); } } 

Kimenet:

 Simple 

2) az Object osztály getClass() metódusa

A Class osztály példányát adja vissza. Akkor érdemes használni, ha ismeri a típust. Sőt, primitívekkel is használható.

Fájl név: Test.java

válasszon SQL-t több táblából
 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); } } 

Kimenet:

Simple 

3) A .class szintaxis

Ha egy típus elérhető, de nincs példány, akkor a típus nevéhez '.class' hozzáfűzésével lehet osztályt szerezni. Primitív adattípusokhoz is használható.

Fájl név: 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()); } } 

Kimenet:

 boolean Test 

Az osztályobjektum meghatározása

A Class osztály következő metódusai használhatók az osztályobjektum meghatározására:

1) publikus logikai isInterface(): meghatározza, hogy a megadott Class objektum interfésztípust képvisel-e.

2) nyilvános logikai isArray(): meghatározza, hogy ez a Class objektum egy tömbosztályt képvisel-e.

3) nyilvános logikai isPrimitive(): meghatározza, hogy a megadott Class objektum primitív típust képvisel-e.

Nézzük az objektumtípus meghatározásához a tükrözési API egyszerű példáját.

Fájl név: Test.java

10/100
 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);} } } 

Kimenet:

 false true 

A reflexió előnyei és hátrányai

A Java tükrözést mindig óvatosan kell használni. Bár a tükrözésnek sok előnye van, van néhány hátránya is. Először beszéljük meg az előnyöket.

Előnyök: Az interfészek, osztályok, metódusok és mezők futás közbeni ellenőrzése lehetséges tükrözés segítségével, még a nevük használata nélkül is a fordítási idő alatt. Lehetőség van metódusok meghívására, törlés példányosítására vagy a mezők értékének beállítására tükrözéssel. Segít a vizuális fejlesztői környezetek és osztályböngészők létrehozásában, amelyek segítséget nyújtanak a fejlesztőknek a megfelelő kód megírásában.

Hátrányok: A reflexió segítségével megtörhetjük a tokozás alapelveit. Egy osztály privát metódusaihoz és mezőihez reflexióval lehet hozzáférni. Így a reflexió fontos adatokat szivároghat ki a külvilág felé, ami veszélyes. Például, ha az egyik hozzáfér egy osztály privát tagjaihoz, és null értéket állít be, akkor ugyanannak az osztálynak a másik felhasználója megkaphatja a NullReferenceException kivételt, és ez a viselkedés nem várható.

Egy másik hátrány a teljesítmény rezsije. Mivel a tükröződő típusok feloldása dinamikusan történik, a JVM (Java Virtual Machine) optimalizálása nem valósulhat meg. Ezért a reflexiók által végrehajtott műveletek általában lassúak.

Következtetés

A fent említett hátrányok miatt általában tanácsos kerülni a reflexió használatát. Ez egy speciális funkció, amelyet csak olyan programozók vagy fejlesztők használhatnak, akik jól ismerik a nyelv alapjait. Mindig emlékezz! A reflexió használatakor az alkalmazás biztonsága veszélybe kerül.


Következő Topics of Reflection API oktatóanyag

newInstance() metódus
A javap eszköz megértése
Javap eszköz létrehozása
appletviewer eszköz létrehozása
Hívja meg a privát metódust egy másik osztályból