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.
- 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ódszer | Leí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 dob | betö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 dob | az osztály mezőinek teljes számát adja vissza. |
9) public Method[] getDeclaredMethods() dobja a SecurityException-t | az osztály metódusainak teljes számát adja vissza. |
10) public Constructor[] getDeclaredConstructors()dobja a SecurityException-t | az osztály konstruktorainak teljes számát adja vissza. |
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)dobja a NoSuchMethodException,SecurityException | a 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ódusA 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