A dinamikus nyelvek dinamikusan 1. rész

Java-fejlesztők tudják, hogy a Java nem mindig a legjobb nyelv megoldani valamilyen probléma. Ebben az évben, a kibocsátás a 1.0-s verzióját JRuby és Groovy is fokozott érdeklődést beépítése dinamikus nyelvek a Java alkalmazásokat. Groovy, JRuby, Rhino, Jython, és más nyílt forráskódú projektek lehetőséget adnak arra, hogy írjon a kódot az úgynevezett programozási nyelvek és futtatni ellenőrzése alatt JVM. Eddig az integráció következő nyelveken Java-kód, általában azt jelenti, hogy meg kell vizsgálni az egyes tolmács egyedi API és a végrehajtás részleteit.

Csomag javax.script. hozzáadott Java SE 6, megkönnyíti az integráció dinamikus nyelvek. Ez biztosítja a következetes, egyszerű módja annak, hívjon egy sor script nyelv segítségével egy kis sor pontok és a konkrét osztályok. De a Java script API - ez több, mint enyhülést létrehozását megírt alkalmazások töredékek; Scripting támogatási csomag lehetővé teszi, hogy olvassa el, és indítsa el a külső script on the fly, ami azt jelenti, hogy a dinamikus módosítását a szkriptek magukat változtatni a viselkedését a futtatható alkalmazást.

Scripting ellen hangszórók

Scripting API kétirányú láthatóságát a Java-alkalmazások és külső scripteket. A Java-kód nem csak hívni külső scripteket, de emellett az ilyen szkripteket hozzáférést a választott Java-objektumokat. Külső Ruby szkript például hivatkozhat módszerek Java objektumok és hozzáférhetnek azok tulajdonságait, amely lehetővé teszi a szkripteket adhatunk a futtatható alkalmazás viselkedését, amelyet nem abban az időben a fejlődés.

Fellebbezés a külső script lehet használni, hogy bővíteni annak teljesítése során az alkalmazás működésének, konfiguráció, monitoring, vagy más sebészeti beavatkozás - például a változó üzleti logika, anélkül, hogy állítsa le az alkalmazást. Lehetséges felhasználása script támogatási csomag tartalmazza:

  • Írás üzleti logika egyszerűbb, mint a Java, a nyelvet, anélkül, hogy a fejlett futás közben.
  • Az épület építészeti alapuló plug-inek (plug-in), amely lehetővé teszi a felhasználók számára, hogy a szoftver az adott menet közben.
  • Integrálni a meglévő scriptet a Java-alapú alkalmazás, például a szkript feldolgozása vagy átalakítására szöveges fájlokat.
  • Hogy készítsen egy külső konfiguráció a működési viselkedését az alkalmazás segítségével egy teljes értékű programozási nyelv, hanem a konfigurációs fájlt.
  • Add Java alapú alkalmazás nyelv, amely kifejezetten e tárgykörben.
  • Tegyünk egy programozási nyelv, míg a prototípus Java-alapú alkalmazások.
  • Írjon script nyelvi tesztelés kódot az alkalmazás.

1. lista a legfontosabb módszer HelloScriptingWorld

A fő feladata az eljárás main () - másolat átvétele javax.script.ScriptEngine (az első két formatervezési 1. lista). Parancsértelmezőjének terhelés és végrehajtja a script egy adott nyelvet. Ez a leggyakrabban használt és népszerű osztály Java-script csomagot. Eltávolítja a script motorja javax.script.ScriptEngineManager (első feladat kifejezés). Egy tipikus igény - egyre a program csak egy példányban a motor, ha nem használja a sok script nyelv.

ScriptEngineManager. talán az egyetlen valódi osztály a script csomag, amely akkor úgy kezelik rendszeresen; a legtöbb más - interfészek. És ez talán az egyetlen osztály a script csomag, amelynek másolatát fog létrehozni közvetlenül (vagy közvetve - bevezetése révén egy olyan mechanizmus szerint (függőség injekció) úgy, ahogyan a Spring Framework). ScriptEngineManager visszatérhet egy script motort a következő három módon :

ScriptEngineManager s készítenek és script motor közvetve. Ie létrehozásakor példányban szkriptmodult-vezetők fordul a kereső szolgáltatás (hozzáadott Java 6) kimutatására minden regisztrált implementáció javax.script.ScriptEngineFactory a CLASSPATH Ezek gyári osztályok jönnek csomagok implementációja Java script API; akkor valószínűleg soha nem kell közvetlenül tárgyalnia ezen osztályok.

Mint már említettem, a kódot használja szkriptmodult például, hogy végre a forgatókönyvet. Scripting motor jár el közvetítőként az Ön script kódot és célnyelvi tolmács vagy fordító, ami végső soron, és végrehajtja a kódot. Ezért nem kell tudni, hogy melyik osztályba által használt egyes értelmező tesztelésre kódot. Például a script motort JRuby múljék a kódot az első osztályba org.jruby.Ruby fokon össze egy script egy köztes forma, majd hívja meg ismét futtatni a scriptet és a folyamat visszatérési értékeket. A végrehajtás a script támogatás elrejti a részleteket, beleértve, hogy a tolmács egyetért osztály definíciók, az alkalmazások és az I / O-patak tárgyak Java-kódot.

Ábra. 1. általában azt mutatja, milyen összefüggés van a kérelem, Java script API, a végrehajtás szkriptmodult és programozási nyelv értelmező. Meg kell azonban jegyeznünk, hogy az alkalmazás támaszkodik csak a script API biztosítja osztályok és ScriptEngineManager szkriptmodult felület. Szkriptmodult felület, a komponens szolgál az összes sajátosságait a használata egy adott nyelv tolmács.

1. ábra: összefüggések Scripting API komponenseket

Te, azt hiszem, érdekel a kérdés, hol kapjuk meg a szükséges JAR-fájlok végrehajtása scripting motor és tolmács. A legjobb hely, ahol keresni a megvalósítása a motor, mindenekelőtt egy nyílt forráskódú projekt a Scripting által támogatott java.net (lásd a forrásokat.). Itt található a végrehajtás a script motorokat többféle nyelven és linkek más források a témáról. Scripting projekt egyben link a letöltéshez tolmácsok támogatott programozási nyelvek.

2. lista eljárás invokeHelloScript

A végrehajtás keretében a forgatókönyvet

Kérjük, vegye figyelembe - ez és más módszerek az osztályban kijelentik, hogy dobja javax.script.ScriptException kivétel. Ez egy ellenőrzött kivétel - az egyetlen dolog biztos: a script csomag - azt jelzi, hogy a motor nem közben elemzés és a végrehajtó kódot. Minden módszer eval () script motor bocsátanak ScriptException. Ezért a kódot kell megfelelően kezelni ezt a helyzetet.

3. lista módszerei és defineScriptFunction invokeScriptFunctionFromEngine

4. lista módszer invokeScriptFunctionFromJava

Részletes szkriptek segítségével a hívás proxy

Ha egy script funkciót vagy eljárást valósít meg a Java-i - áll a használatra fejlettebb Invocable. Invocable interfész meghatározza getInterface () módszer. elfogad paraméterként felületet és visszatér a Java proxy objektumot, amely megvalósítja ezt a felületet korábban biztosított. Miután megvan a proxy objektumot a script motor, akkor kezelni, mint egy közönséges Java objektum. Okozta a proxy módszerekkel delegálják a script motor végrehajtani programozási nyelv.

Java Scripting API nem igényel script motor végrehajtás Invocable felület. Tény, hogy a kódot a 4. lista kellett volna használni a leadott instanceof operátor. meggyőződni arról, hogy a motor hajtja végre Invocable felület.

Példák a 3. listában és 4. lista azt mutatja, hogy a Java-kód hivatkozhat funkciók vagy meghatározott módszerek egy programozási nyelv. Most, akkor valószínűleg érdekel -, hogy a programozási nyelv kód, viszont hivatkozhat módszerek Java-objektumokat. Talán. invokeJavaFromScriptFunction () metódus az 5. lista mutatja -, hogyan lehet hozzáférni a Java-objektumokat a script motor és hogyan script kódot lehet hivatkozni módszerek Java-objektumokat. Különösen invokeJavaFromScriptFunction () metódus a megadott motor put () metódus át egy példánya a HelloScriptingWorld motort. Miután a motor bejutott a Java objektum nevén keresztül jut el a hívást put (). script kód hívja a eval () metódus használja.

5. lista Módszerek invokeJavaFromScriptFunction és getHelloReply

Amikor a script motor teszi a Java-objektum elérhetővé a szkript fut futási idő, a motor kell csomagoljuk be egy objektum típus, amely alkalmas arra, hogy a jelenlegi programozási nyelv. Egy ilyen csomag kell végeznie a megfelelő konverziós érték tárgyak, például ne használja a Java kapcsolatos Egész objektum közvetlenül a matematikai kifejezések programozási nyelv. Kitalálni, hogy a Java-objektumok átírták scripting tárgyak az egyes scripting motor, és túlmutat a vita ebben a cikkben. Mégis, akkor tisztában kell lennie azzal, hogy az ilyen fordítás történik, így ki lehet próbálni a programozási nyelv biztosítására alkalmazott kiszámíthatósága végrehajtott reformok.

ScriptEngine.put és kapcsolódó get () metódus a fő elosztó módszer az objektumok hozzáférése és az adatok között a Java-kód és végrehajtható script motort. (Expanded vita ebben a témában lásd. Az alábbiakban a hatálya alá a futó szkript.) Amikor hívja a motoron, put () metódus. script motor társítja a második paraméter (tetszőleges Java-objektum) egy adott karakterlánc. A legtöbb script motor hozzáférhetőségének biztosítása ezen létesítmények Java-script a megadott változó nevét. Motorok szabadon fellebbezhet az átruházott, hogy tegye () metódus neveket. Például JRuby scripting motor teszi HelloScriptingWorld rendelkezésre Ruby-kód mint globális változó $ helloScriptingWorld. amely megfelel a Ruby szintaxis globális változókat.

get () módszer beolvassa az értékeket a motor, egy script környezet. Általában minden globális változó, és a funkció a környezetben elérhető Java-kódot a get () metódus. De szkriptek csak azokat a Java objektumok deklarált scripting motor közvetlenül - hívja fel ().

Ez a képesség elérni és módosítani a Java-objektumokat a futtatható alkalmazást a külső script egy hatékony technika, kiterjeszti a funkcionalitás a Java-programok. (Ez a technika részt a példát a 2. rész)

Meg lehet kezdeni letölteni HelloScriptingWorld app és a link forráskód. zip fájl tartalmazza az elrendezés script Ant és Maven, hogy könnyebb lefordítani és futtatni a minta-alkalmazás. Kövesse az alábbi lépéseket:

  1. Töltse le a zip-fájl.
  2. Hozzon létre egy új könyvtárat, például a java-script és csomagold itt szerzett az előző lépésben fájlt.
  3. Nyisson meg egy parancssort, és váltson a könyvtárba.
  4. Fuss hangya run-szia.

Listing 6. kimenet futtatását HelloScriptingWorld

Java API scriptek megjelent Java SE 6, de akkor is használni a Java SE 5. Csak azt kell, hogy egy megvalósítása a hiányzó osztályok javax.script csomagot. Szerencsére, a végrehajtás áll a Java Specification Request 223 referencia implementációt. JSR 223 meghatározza a Java script API.

Azon túl, hogy ahogy telik az Java objektumok a végrehajtható script motor, érdemes fejlettebb végrehajtására, mint egy kihívás szán módszerek get (), és tegye (). Ha telefonál get () vagy put () a motort, hogy kivonja, és tárolja a kívánt gombot a megadott helyre másolatot javax.script.Bindings felület. (Bindings felület csak egy térkép felületen. Service karakterlánc kulcsokat.)

Amikor a kód okozza a dia eval () metódust. oldalán a motor egy előre meghatározott kötődés kulcsértékek. Azonban, ha a kínálat a saját kötések tárgy szolgálat felhívja az eval (). körét korlátozni változók és objektumok a script. Majd a hívás jelenik meg eval (String, kötések), vagy eval (Reader, kötések). Ahhoz, hogy megkönnyítik az adott kötés. script motorokat kínálnak createBindings () metódust. visszaad egy üres objektumot kötések. Az eval a kötések objektum ideiglenesen elrejti a Java-objektumokat korábban tárolt, előre meghatározott kötelező a motor.

Felhalmozódnak a történelem scripting motor tartalmaz két előre meghatározott kötési mechanizmus: kötelező hatálya arra a szintre, a motor (motor hatálya kötések) használunk a hívások () és a put (). és kötelező a globális hatókörű (globális hatókörű kötések) motorral lehet használni, hogy keressen tárgyak esetén nem lehetett talált szintjén kötelező „motor körét”. A megfogalmazás lehet - nélkülözhetetlen. Script motor nem szükséges, hogy hozzáférést biztosít a globális kötődés szkripteket. Bár sok script motor, hogy a hozzáférés biztosított.

Konstruktív cél „globális hatókörű” -svyazyvaniya - megosztás lehetőségek különböző script motorokat. Mindegyik motor visszatér egy példányát ScriptEngineManager. felszerelt ugyanazt az objektumot a globális érvényű. Akkor tölteni ezt az objektumot hívja getBindings (ScriptContext.GLOBAL_SCOPE), és hozzá egy globális erejű tárgyat a motor keresztül setBindings (kötések, ScriptContext.GLOBAL_SCOPE).

ScriptContext - olyan felület, amely meghatározza és szabályozza az átfutási idő a script motor összefüggésben. ScriptContext abból áll kötődés „slide” és a „globális” Scopes, valamint a bemeneti / kilépő anyagokat a motort a standard I / O műveletek. Tudod kap egy script motor összefüggésben és manipulálni a DIP módszer getContext ().

Concepts Scripting API, mint például egy olyan terület hatálya láthatóságot. kötési kötések, és összefüggésben lehet, az első, zavaros, mert a átfedő jelentése. Boot fájl forráskódját ez a cikk tartalmazza a JUnit teszt fájlt, úgynevezett ScriptApiRhinoTest található, és a src / test / java. Java-kód abban foglalt célja, hogy segítsen megérteni ezeket a fogalmakat.

Letöltések

Kapcsolódó cikkek