JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku...

15
JavaScript Pomoce http://htmlcheatsheet.com/js / https://www.n-k.de/riding-the-nashorn https://developer.mozilla.org/en- US/docs/Web/JavaScript/Guide/Working_with_Objects https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/ https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions https://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_gui de/

Transcript of JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku...

Page 1: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

JavaScript

• Pomoce– http://htmlcheatsheet.com/js/

– https://www.n-k.de/riding-the-nashorn

– https://developer.mozilla.org/en-

US/docs/Web/JavaScript/Guide/Working_with_Objects

– https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html

– http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/

– https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

– https://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_gui

de/

Page 2: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

JavaScript

• Przesiadka z Rhino na Nashorn

W Rhino można było zaimportować klasy i pakiety Java poleceniami:

importPackage(com.organization.project.package);

importClass(Packages.org.mozilla.javascript.Context);

Nashorn takiego importowania nie obsługuje. By dostarczyć taką możliwość należy

dodać następującą linię do skryptu (dla bezpieczeństwa ujętą w blok try-catch)

try{

load("nashorn:mozilla_compat.js");

} catch(e){ }

Zapewnienie wstecznej kompatybilności w ten sposób jest niezalecane. Zamiast tego do importowania klas Java powinno używać się JavaImporter:

var scope = new JavaImporter(com.x.y)

scope.z // z jest klasą w pakiecie com.x.y.

Page 3: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Uruchomienie interpretera w konsoli

• WindowsC:\> cd %JAVA_HOME%\bin C:\PROGRA~1\Java\jdk1.8.0_144\bin> jjsjjs> print (Witamy');

Witamy

• Linuxuser@host:~$ cd $JAVA_HOME/bin

user@host:/usr/lib/jvm/java-8-oracle/bin$ jjs

jjs> print ('Witamy');

Witamy

• jjs lub jrunscript

> jjs -scripting

jjs> l = `ls -al`

Page 4: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Ewaluacja skryptu podanego jako ciąg

znaków w klasie Java

package javascript_sample;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

public class LittleSample {

public static void main(String ... args) {

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

try {

// execute the JavaScript code

engine.eval("print ('Hello World')");

} catch (Exception e) {

}

}

}

Page 5: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Ewaluacja skryptu wczytanego z pliku

w klasie Java

package javascript_sample;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

public class LittleSample {

public static void main(String ... args) {

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

try {

engine.eval(new FileReader ("script.js"));

} catch (Exception e) {

}

}

}

script.js

print ('Hello World')

Page 6: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Wywołanie funkcji z kodu skryptu

wczytanego z pliku// pominięto definicję pakietu i importy

public class LittleSample {

public static void main(String... args) {

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

try {

engine.eval(new FileReader("script.js"));

} catch (FileNotFoundException | ScriptException e1) {

}

Invocable invocable = (Invocable) engine;

Object result = null;

try {

result = invocable.invokeFunction("fun", "Tester");

} catch (NoSuchMethodException | ScriptException e) {

}

System.out.println(result);

System.out.println(result.getClass());

}

} script.js

var fun = function (name) {

print ('Witamy w JS ' + name);

return "Pozdrowienia z JS";

};

Witamy w JS Tester

Pozdrowienia z JS

class java.lang.String

Page 7: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Wywołanie metody klasy Java w JS

path> cd bin

path> jjs -cp .

jjs> var sample = Java.type ('javascript_sample.SampleClass');

jjs> sample.fun1('Jan')

Witamy w Java Jan

Pozdrowienia z Java

> java.lang.String.join (" ","Witamy","znowu")

Witamy znowu

package javascript_sample;

public class SampleClass {

public static String fun1 (String name) {

System.out.format ("Witamy w Java %s\n", name);

return "Pozdrowienia z Java";

}

}

Page 8: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Rozszerzanie klas i filtrowanie// Nashorn pozwala użyć Java Reflection APIs (np. klas z pakietów

java.lang.reflect,java.lang.invoke), jednak skrypt musi posiadać pozwolenia

nashorn.javaReflection (i menadżera bezpieczeństwa).

// https://stackoverflow.com/questions/20793089/secure-nashorn-js-execution

// Gdy korzysta się z filtru klas, Nashorn nie pozwala dostać się do klas Java

Reflection APIs (nawet przy braku menadżera bezpieczeństwa).

// Jeśli Java Reflection APIs jest stosowane do ładowania klas

(Class.forName(String)), to filtrowanie klas jest niepotrzebne.

// przypadek ogólny

var Run = Java.type("java.lang.Runnable");

var MyRun = Java.extend(Run, {

run: function() {

print("Run in separate thread");

}

});

var Thread = Java.type("java.lang.Thread");

var th = new Thread(new MyRun());

// przypadek szczególny (SAM - single abstract method)

var Thread = Java.type("java.lang.Thread")

var th = new Thread(function() print("Run in a separate thread"))

Page 9: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Ziarna Java w JS

// Nashorn pozwala użyć ziaren tak, że dostęp do ich

właściwości może odbywać się bezpośrednio w instrukcji

przypisania (odpalane są wtedy odpowiednie metody get i set,

dla przypadku poniżej: getYear(), setYear())

jjs> var Date = Java.type ('java.util.Date');

jjs> var date = new Date ();

jjs> date.year += 1900;

2018

Page 10: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Tablice Java w JS// zadeklarowanie tablicy java w skrypcie

jjs> var intArray = Java.type ("int[]")

jjs> var array = new intArray (4)

jjs> array [0] = 12

jjs> array [1] = 32

jjs> array [0] + arr [1]

44

jjs> array[4]

java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 4

jjs> arr.length

4

// konwersja tablicy js do tablicy java

jjs> var data = [1,2,3,4,5,6];

jjs> var JavaArray = Java.to(data,"int[]");

jjs> print(JavaArray[0]+JavaArray[1]+JavaArray[2]);

jjs> javaArr.class // class [I

// wypisanie elementów tablicy

jjs> var arr = [ „Witaj", "znowu" ];

jjs> for each (a in arr) { print(a) }

Witaj

znowu // for each (variable in object) { statement }

Java.to(array, Java.type("java.util.List"))

Page 11: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Kolekcje Java w JS

jjs> var ArrayList = Java.type ("java.util.ArrayList");

jjs> var lst = new ArrayList ();

jjs> lst.add ('b');

true

lst.add ('a');

true

lst.add ('c');

true

jjs> for each (var el in lst) print (el);

b

a

c

jjs> var Collections = Java.type ("java.util.Collections");

jjs> print ('Before sort: ', lst);

Before sort: [B, A, C]

jjs> Collections.sort (lst);

jjs> print ('After sort: ', lst);

After sort: [A, B, C]

Page 12: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Funkcje jednolinijkowe (rozszerzenie)

jjs> function sqr(x) x * x; // function sqr(x) { return x*x }

function sqr(x) x * x

jjs> print (sqr (2));

4

jjs>

Page 13: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Dostęp do shella

> jjs -scripting

jjs> `ls –al`

You can embed JavaScript expressions and variables in

JavaScript code. In the following code we are embedding a

variable to string. To execute this program you need to

pass a flag -scripting in command-line.

File: hello.js

1.var hello = function(msg){

2. print("Hello ${msg}");

3.};

4.hello("Nashron");

Command: jjs -scripting hello.js

Output:Hello Nashorn

Page 14: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

Wyjątki

var ArrayList = Java.type ("java.util.ArrayList");

var lst = new ArrayList ();

try {

var firstElement = lst.get(0);

} catch (e) {

if (e instanceof java.lang.IndexOutOfBoundsException)

print('No elements in list');}

Page 15: JavaScripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/...Reflection APIs (nawet przy braku menadżera bezpieczeństwa). // Jeśli Java Reflection APIs jest stosowane do ładowania

GraalVM

https://www.graalvm.org/docs/getting-started/

https://royvanrijn.com/blog/2018/09/part-1-java-to-native-

using-graalvm/

https://dzone.com/articles/learning-to-use-the-graalvm