javascripttomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/java/...reflection apis (nawet przy braku...
Post on 04-Jul-2020
3 Views
Preview:
TRANSCRIPT
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/
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.
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`
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) {
}
}
}
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')
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
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";
}
}
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"))
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
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"))
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]
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>
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
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');}
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
top related