Ez - archiv
A típus azonosításának futásidőben
Tekintsük a mechanizmus a típus azonosítását futásidőben (RTTI - futásidejű típus azonosító).
Ez a mechanizmus több részből áll, amelyek jellemzik azok fontosságát, összetettsége és gyakorisága.
- Alapvető eszközök RTTI szolgáló mechanizmus polimorfizmus. Ennek megfelelően használják őket folyamatosan programozás során a Java.
- Az első elérésekor egy osztály a programok teremt Class objektum az osztály. Azt is utal, hogy a RTTI eszközökkel.
- Meghatározó mechanizmusok típusok (osztályok) objektumok futási időben használják elég gyakran. A legegyszerűbb ezek a mechanizmusok, instanceof működését. Már tárgyalt.
- A legbonyolultabb mechanizmusát RTTI tükrözi. Ez az eszközöket, hogy teljes körű információt az osztály, mint például egy listát a területeken, kivitelezők, módszerek, stb A kapott információ felhasználható objektumok létrehozásához ennek az osztálynak, hívja a módszereket.
Alapvető eszközök RTTI
Bármilyen típusú átalakítás a bázis a generált (bearish transzformáció fajták, downcasting) végezzük dinamikus vezérlése a megfelelő típusú.
Tegyük fel például, hogy van egy osztály Base:
És tőle Derived1 generált osztályok. Derived2 Derived3. A programban üzemeket építenek ezen osztályok és tárolja azokat a ArrayList listán. Ezután akarunk menni ezeken az oldalakon és felhívni minden módszer f (). Ez a következőképpen néz ki.
Valahol a programban általunk leírt ArrayList.
Egy másik pontján a programban
Itt a következő Iterator interfészt módszer visszaadja egy objektum. De tudjuk, hogy a tárgyak Derived1 osztályokba sorolja. Derived2 és Derived3. egy alap osztályt, ami az alap. Nem hívhatjuk f () az objektum. Ezért adja meg az Alap és hívás f ().
Ez a minta példája alkalmazása polimorfizmus. De ami a legfontosabb, nem szabad elfelejteni, hogy ebben az esetben, mint más hasonló esetekben a dinamikus típus vizsgálja a futásidőben. Ha a lista lesz a tárgy bármely más osztály, amelyre a bázis nem a bázis, a teljesítés során felmerül kivétel ClassCastException.
Ezen túlmenően, a dinamikus vezérlés az ilyen típusú helyzet, akkor a hívás, hogy a kívánt f () metódust. Még nem beszéltünk osztályok Derived1. Derived2 és Derived3. De ezek közül bármelyik, akkor újra (felülírás) eljárás f (). Ugyanakkor ebben a részletet mindegyik objektum f () metódus kerül meghívásra a listát az osztályban. És nem kell, hogy ezt a különleges intézkedésekre.
Tárgyak a Class
osztályú objektum jön létre az egyes osztályokra, a programban használt, amikor először hozzáférhessen. Az első a hozzáférést egy osztály lehet létre példányt egy osztály vagy a fellebbezési statikus módszer vagy területen. Vannak más lehetőségek a RTTI mechanizmus.
Hozzáféréssel rendelkező osztályú objektumot. megfelel egy osztály, akkor létre egy példányt ebbe az osztályba, hogy az osztály nevét és felhívni sok egyéb információt az osztályban.
Nézze meg a dokumentációt. Csomag java.lang osztály osztály.
Az első dolog, amit meg kell jegyezni, hogy nem a nyilvánosság konstruktőrök, valamint egy leírás az osztály:
Ez azt jelenti, hogy nem lehet örökölni ezt az osztályt, akár kifejezetten objektumok létrehozásához ennek az osztálynak. Class úgy van kialakítva, hogy nem lehet létrehozni több objektum minden osztályban. Virtuális gép Java (VM) létrehoz egy ilyen objektum automatikusan az első hívást az osztálynak.
Számos módja van, hogy ez a tárgy egy adott osztályban.
- A rendszer segítségével a statikus módszer osztály osztály
- A szintaxis nevű szó osztály Class tárgyakat.
- A módszer getClass Object osztályban.
Az első esetben, tudnunk kell, hogy a teljes nevét az osztály. Másodszor, az osztály elérhetőnek kell lennie a java-fájlba (az import utasítást). Az utóbbi lehetőség lehet használni ahhoz, hogy a Class objektum az osztály egy objektum egy bizonyos osztály.
Használhatja a fenti módszerek valamelyikének, attól függően, hogy mi áll a számunkra ezen a ponton a programban. De ceteris paribus jobb, hogy részesítsék előnyben a második ilyen módszerek alkalmazásával - a Class szó tárgyakat.
Literálok osztályú objektum
A szintaxis a design nagyon egyszerű:
majd egy linket osztályú objektumot java.util.ArrayList osztályban.
Ez a lehetőség előnyös másoknak, mert ellenőrzött fordításkor. Ezen túlmenően, ez egyszerűbb, mint más lehetőségek.
osztályú objektumokat hoz létre nemcsak az összes osztály részt vesz a programban, de a primitív típusokat. Sőt, a tárgy literálok osztály osztály - kétféleképpen jut be ezeket az objektumokat. A legfontosabb dolog -, hogy tudja, hogyan van írva a program.
Például írja int megfelelő szó néz ki: int.class.
Egy alternatív módszer az, hogy az egy statikus mező osztályban TYPE shell (wrapper-osztály) az egyszerű típusú. Például, az int. Integer.TYPE.
Meghatározása az objektum típusa a programban
Néha szükség van annak megállapítására, illetve ellenőrizni, hogy milyen típusú objektumot. Leggyakrabban ilyen igény merül fel során a lefelé irányuló konverziós osztályok (downcasting) annak érdekében, hogy ellenőrizze az érvényességét egy ilyen átalakulás.
Az egyik ilyen módon már tárgyalt a 8. ülésén. Ez instanceof működését.
Egy másik módszer annak a következménye, az anyag a fent tárgyalt osztályú osztályban.
A harmadik lehetőség, hogy egy osztály módszer Osztály isInstance.
Vegyük ki és hasonlítsa össze ezeket a módszereket.
A 8. ülés, néztük egy példát
Mint látható a példában a bal oldali operandusa a művelet instanceof kifogás joga - osztályban.
Egy másik módja, hogy hasonlítson, hogy összehasonlítsa a Class objektumot. Mivel minden egyes csoportjára egy ilyen tárgy van jelen a szinguláris, kapott két hivatkozás a Class objektum osztály. akkor lehet csak összehasonlította az egyenlőség. Ebben a példában ez a következőképpen nézhet ki:
Ez a módszer azonban az összehasonlítás eltér az összehasonlítás használatával instanceof. Különösen vonatkozik ebben a példában, ha a könyv osztályban nincs leszármazottja. Ha elképzeljük, hogy a könyv az osztályba leszármazottai (pl Fantasy és DetectiveStory), a tárgyak ezen osztályok megtekintéséhez
Ugyanakkor a csekket
(Azaz az alkalmazás instanceof művelet) fog működni, mert ez a művelet az osztály öröklési.
Ez ellentétben a fent leírt módszerek összehasonlítását kell figyelembe venni. Leggyakrabban, szükségünk van valamire, ami instanceof. és csak ritka esetekben előfordulhat, hogy érdekelt pontos összehasonlítását osztályok, amely lehet tenni összehasonlításával utalás egy Class objektumot.
És végül ott van a lehetőség egy összehasonlítás isInstance osztályú módszer. Szemantikailag, ez a módszer nem különbözik a használata instanceof működését. Ezek a különbségek tisztán szintaktikai. Tehát a mi mintaalkalmazáshoz lenne vizsgálni isInstance
Objektumok létrehozásához használja a newInstance módszer
Térjünk vissza a dokumentációban a Class osztály. Eljárások közül a ebbe az osztályba tartozó newInstance módszer.
Ez a módszer lehetővé teszi, hogy létrehoz egy objektumot az osztály jön létre az objektum osztály. Bár ebben az esetben az alapértelmezett konstruktor (az egyéb tervezők úgy lent).
Egy bevezetés a módszer egy példát.
Ez az interaktív program egy szövegdobozba belépő osztály nevét és a szöveg mezőbe a kimeneti eredményeket hozzon létre egy osztály tárgyak segítségével newInstance módszerrel.
Ottransliruem és a program futtatásához. Mi fog tenni néhány tesztet. Az alábbiakban látható. bemutatott vizsgálati eredmények.
Mivel az osztályok nevei ebben a tesztben adtuk 5 sor: abc. Húr. java.lang.String. java.lang.Integer és javax.swing.JLabel. Nézzük az esetben sikertelen vizsgálatok.
- abc - nincs ilyen osztály.
- Húr - kell a teljesen minősített osztály nevét a csomagot.
- java.lang.Integer - ezen osztály, nincs alapértelmezett konstruktor.
Ez a program bemutatja a módszereket és forName newInstance. A fő hangsúly a program desystviya CreateObject módszer. Ez a módszer először kiválasztja az osztály nevét a felhasználó által megadott, a szöveges mezőbe. Ezután a try blokkban. alkalmazásával forName módszer szerez egy hivatkozás a Class objektum az osztály, és létrehoz egy objektumot ezen osztály módszer newInstance.
Ahogy forName módszer. és newInstance módszer lehet dobni kivételek. Tesztelése megadott példában ábrán. Ez bizonyítja ezt. Amikor beír abc és a String nevek kivétel ClassNotFoundException történt forName módszer. Ha belép java.lang.Integer alakult InstantiationException kivétel newInstance módszer.
Áttekintettük az alapvető jellemzői a RTTI. Továbbra is úgy a legnehezebb része a RTTI - reflexió.