Programavimas

„Java“ „Java“

Neseniai paskelbtas „JavaLobby“ įrašas „10 geriausių nenaudojamų„ Java “funkcijų buvo itin populiarus. Šiuo metu tai yra aukščiausias reitingas „DZone Top Links“ kategorijoje. Be to, buvo paskelbtas atsakymas. Abiejuose tinklaraščių įrašuose yra daug įdomių pastebėjimų apie nepakankamai naudojamas „Java“ funkcijas ir aš sutinku su kai kuriais labiau nei su kitais. Tačiau mano dėmesį tikrai patraukė teiginys, kad „Java SE 6“ yra viena iš labiausiai nenaudojamų „Java“ funkcijų.

Man labai patinka dirbti su „Java SE 6“ ir praeityje kelis kartus rašiau apie „Java SE 6“ funkcijas ar rašiau jas tinklaraštyje. Šiame tinklaraščio įraše ketinu parodyti dalį „Java SE 6“ galimybių talpinti vykdyti „JavaScript“ kodą.

Dauguma „Java“ kūrėjų ir „JavaScript“ kūrėjų supranta, kad be keturių raidžių „J-A-V-A“ „JavaScript“ ir „Java“ turi labai mažai bendro dalyko, išskyrus tam tikrą C tipo paveldą. Vis dėlto kartais gali būti naudinga paleisti scenarijų kalbą iš „Java“ kodo, o „Java SE 6“ tai leidžia.

Paketas javax.script buvo pristatytas kartu su „Java SE 6“. Jame yra klasės, sąsajos ir pažymėta išimtis, susijusi su scenarijaus variklių naudojimu „Java“. Šiame tinklaraščio įraše daugiausia dėmesio bus skiriama „ScriptEngineFactory“, „ScriptEngineManager“, „ScriptEngine“ ir „ScriptException“.

Vienas iš pirmųjų dalykų, kurį galbūt norėsite padaryti, yra nustatyti, kurie scenarijų varikliai jau yra. Kitas kodo fragmentas parodo, kaip lengva tai padaryti su „Java SE 6“.

final ScriptEngineManager manager = new ScriptEngineManager (); for (final ScriptEngineFactory scriptEngine: manager.getEngineFactories ()) {System.out.println (scriptEngine.getEngineName () + "(" + scriptEngine.getEngineVersion () + ")"); System.out.println ("\ tLanguage:" + scriptEngine.getLanguageName () + "(" + scriptEngine.getLanguageVersion () + ")"); System.out.println ("\ tBendri vardai / slapyvardžiai:"); for (final String engineAlias: scriptEngine.getNames ()) {System.out.println (engineAlias ​​+ ""); }} 

Aukščiau pateiktas kodas sukuria tokią išvestį, kokia parodyta kitame ekrano momentiniame vaizde.

Kaip rodo šis paveikslėlis, „Mozilla Rhino“ „JavaScript“ variklis yra įtrauktas į „Sun“ „Java SE 6.“. Taip pat matome keletą „bendrų pavadinimų“, kurie yra susieti su šiuo konkrečiu varikliu. Bet kuris iš šių pavadinimų gali būti naudojamas ieškant šio variklio. Kituose šio įrašo pavyzdžiuose aš naudosiu šį pavadinimą įprastu pavadinimu „js“.

Kitas kodo pavyzdys pasinaudos pateiktu „Rhino JavaScript“ varikliu, kad vykdytų „JavaScript“ kodą iš „Java“ kodo. Tokiu atveju pasinaudosime „JavaScript“ funkcijos „ToExponential“ pranašumais.

 / ** * Rašykite numerį eksponentine forma. * * @param numberToWriteInExponentialForm Skaičius, kurį reikia pateikti * eksponentine forma. * @param numberDecimalPlaces Dešimtainių skaičių skaičius, kuris turi būti naudojamas * eksponentiniame vaizde. * / public static void writeNumberAsExponential (final Number NumberToWriteInExponentialForm, final int numberDecimalPlaces) {final ScriptEngine engine = manager.getEngineByName ("js"); pabandykite {engine.put ("inputNumber", numberToWriteInExponentialForm); engine.put ("decimalPlaces", skaičiusDecimalPlaces); variklis.eval ("var outputNumber = inputNumber.toExponential (decimalPlaces);"); final String exponentialNumber = (String) variklis.get ("outputNumber"); System.out.println ("Skaičius:" + eksponentinisNumber); } sugauti (ScriptException scriptException) {LOGGER.severe ("ScriptException susidūrė bandant parašyti eksponentinį:" + scriptException.toString ()); }} 

Aukščiau pateiktas kodas tiesiogiai naudoja „JavaScript“ naudodamas „ScriptEngine.eval“ („String“) metodą, kad įvertintų pateiktą eilutę, kurioje yra „JavaScript“ sintaksė. Prieš iškviečiant eval metodo, du parametrai yra „perduodami“ (įrišti) į „JavaScript“ kodą per „ScriptEngine.put“ (String, Object) skambučius. Vykdyto „JavaScript“ rezultato objektas pasiekiamas naudojant „Java“ kodą naudojant „ScriptEngine.get“ („String“) skambutį.

Norėdami parodyti aukščiau pateiktą kodą naudodami toExponential funkciją, naudosiu šį „kliento“ kodą.

galutinis int sourceNumber = 675456; writeNumberAsExponential (sourceNumber, 1, System.out); writeNumberAsExponential (sourceNumber, 2, System.out); writeNumberAsExponential (sourceNumber, 3, System.out); writeNumberAsExponential (sourceNumber, 4, System.out); writeNumberAsExponential (sourceNumber, 5, System.out); 

Kai minėtas kodas vykdomas prieš anksčiau parodytą metodą writeNumberAsExponential ir naudojamas „JavaScript“, išvestis atrodo panaši į tą, kuri parodyta kitame ekrano momentiniame vaizde.

Šio pavyzdžio pakanka parodyti, kaip lengva pasinaudoti „Java SE 6“ „Java“ funkcijomis. Tačiau tai galima įgyvendinti dar bendriau, kaip parodys kiti du pavyzdžiai. Pirmasis pavyzdys rodo sąlyginai savavališko „JavaScript“ iškvietimą be jokių parametrų, kurie perduoti / susieti, o antrasis pavyzdys - palyginti savavališko „JavaScript“ su perduotais / susietais parametrais iškvietimą.

Gana savavališką „JavaScript“ eilutę galima apdoroti kodu, panašiu į tą, kuris parodytas toliau.

 / ** * Apdorokite perduodamą „JavaScript“ scenarijų, kuriame turėtų būti priskyrimas * kintamajam, kurio vardas nurodytas pateiktame nameOfOutput, ir * gali apimti parametrus, kuriuos nurodo inputParameters. * * @param javaScriptCodeToProcess Eilutė, kurioje yra „JavaScript“ kodas, turi būti įvertinta. Nėra patikrinta, ar ši eilutė yra tinkama, ir dėl to * gali būti užmesta „ScriptException“, kuri * būtų užregistruota. * @param nameOfOutput Išvesties kintamojo, susieto su * pateiktu „JavaScript“ scenarijumi, pavadinimas. * @param inputParameters Pasirenkamas parametrų pavadinimų žemėlapis su parametrų reikšmėmis *, kurios gali būti naudojamos pateiktame „JavaScript“ scenarijuje. Šis žemėlapis * gali būti nulinis, jei scenarijuje nėra jokių įvesties parametrų. * / public static Object processArbitraryJavaScript (final String javaScriptCodeToProcess, final String nameOfOutput, final Map inputParameters) {Object result = null; galutinis „ScriptEngine“ variklis = manager.getEngineByName („js“); pabandykite {if (inputParameters! = null) {for (galutinis Map.Entry parametras: inputParameters.entrySet ()) {engine.put (parametras.getKey (), parametras.getValue ()); }} engine.eval (javaScriptCodeToProcess); rezultatas = variklis.get (nameOfOutput); } pagauti (ScriptException scriptException) {LOGGER.severe ("ScriptException susidūrė bandant parašyti savavališką„ JavaScript “" + javaScriptCodeToProcess + "':" + scriptException.toString ()); } grąžinimo rezultatas; } 

Aukščiau pateiktas kodas suteikia nemažai lankstumo kalbant apie „JavaScript“, kurį galima apdoroti. Tai tikriausiai nėra pati geriausia gamybos kodo idėja, tačiau lengviau parodyti įvairių „Java“ funkcijų naudojimą „Java“.

Pirmasis šio gana savavališko „JavaScript“ apdorojimo pavyzdys naudoja „JavaScript“ objekto datą. Toliau rodomas kodo pavyzdys.

 System.out.println ("Šiandienos data:" + processArbitraryJavaScript ("var date = new Date (); var month = (date.getMonth () + 1) .toFixed (0)", "month", null) + " / "+ processArbitraryJavaScript (" var date = new Date (); var day = date.getDate (). toFixed (0) "," day ", null) +" / "+ processArbitraryJavaScript (" var date = new Date () ; var year = date.getFullYear (). toFixed (0) "," metai ", null)); 

Šis kodas nurodo, kad reikia gauti „JavaScript“ datą (kuri bus dabartinė data), o tą mėnesį, mėnesio datą ir visus metus reikia išgauti iš tos momentinės datos. Toliau pasirodys to išvestis.

Paskutinis pavyzdys veikė prie savavališkos „JavaScript“ eilutės, tačiau nenaudojo jokių parametrų. Kitas pavyzdys rodo šio savavališko „JavaScript“ eilutės apdorojimo parametrų pateikimą, nes tai rodo „JavaScript“ „pow“ funkcijos naudojimą. Šio pavyzdžio kodas pateikiamas toliau.

 final Map exponentParameters = new HashMap (); exponentParameters.put ("bazė", 2); exponentParameters.put ("eksponentas", 5); System.out.println ("nuo 2 iki 5 yra:" + processArbitraryJavaScript ("var answer = Math.pow (pagrindas, rodiklis)", "atsakymas", exponentParameters)); 

Šio pavyzdžio vykdymo išvestis rodoma šiame ekrano momentiniame vaizde.

Savo paskutinį šio tinklaraščio paskelbimo pavyzdį demonstruoju standartą toString () išvestis Scenarijaus išimtis deklaruota kai kuriuose ankstesniuose pavyzdžiuose. ScriptEngine.eval metodas meta šią patikrintą išimtį, jei įvykdant / vertinant pateiktą scenarijų įvyko klaida. Šis metodas taip pat išmeta „NullPointerException“, jei pateikta eilutė yra nulinė. Toliau rodomas kodas, naudojamas priversti scenarijaus klaidą.

 / ** * Sąmoningai sukelia scenarijaus tvarkymo klaidą, kad būtų rodoma informacijos rūšis *, kurią apima „ScriptException“. * / public static void testScriptExceptionHandling () {System.out.println (processArbitraryJavaScript ("Garbage In", "none", null)); } 

Šis kodas pateikia beprasmišką scenarijų („JavaScript“ sintaksės požiūriu), tačiau būtent to reikia norint parodyti „ScriptException.toString ()“, kuris iškviečiamas kaip išimčių tvarkymo dalis aukščiau nurodytu metodu tvarkant savavališką „JavaScript“ eilutę . Kai kodas vykdomas, matome informaciją apie išimtį, kaip parodyta kitame paveikslėlyje.

Išvesties dalis, iš kurios gaunama ScriptException.toString () yra dalis, kurioje teigiama: "javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: trūksta; prieš sakinį (# 1) eilutėje Nr. 1".

Scenarijaus išimtis yra failo pavadinimas, eilutės numeris ir išimties stulpelio numeris, o tai ypač naudinga, jei vertinimui pateikiamas failas su „JavaScript“ kodu.

Išvada

„Java SE 6“ leidžia paprasčiau naudoti „Java“ Java kode. Kiti scenarijų varikliai taip pat gali būti susieti su „Java“, tačiau patogu turėti „Mozilla Rhino“.

Užbaigti kodo ir išvesties ekrano momentinę nuotrauką

Siekdamas išsamumo, čia į vieną vietą įtraukiu visą kodų sąrašą ir po to gautą išvestį.

„JavaScriptInJavaExample.java“