Skip to content

Commit 0ad5dc4

Browse files
committed
📝 add nashorn code example
1 parent aad683e commit 0ad5dc4

24 files changed

Lines changed: 903 additions & 0 deletions
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import javax.script.Invocable;
4+
import javax.script.ScriptEngine;
5+
import javax.script.ScriptEngineManager;
6+
import java.io.FileReader;
7+
import java.time.LocalDateTime;
8+
import java.util.Date;
9+
10+
/**
11+
* Calling javascript functions from java with nashorn.
12+
*
13+
* @author Benjamin Winterberg
14+
*/
15+
public class Nashorn1 {
16+
17+
public static void main(String[] args) throws Exception {
18+
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
19+
engine.eval(new FileReader("java8-nashorn/src/main/resources/nashorn1.js"));
20+
21+
Invocable invocable = (Invocable) engine;
22+
Object result = invocable.invokeFunction("fun1", "Peter Parker");
23+
System.out.println(result);
24+
System.out.println(result.getClass());
25+
26+
invocable.invokeFunction("fun2", new Date());
27+
invocable.invokeFunction("fun2", LocalDateTime.now());
28+
invocable.invokeFunction("fun2", new Person());
29+
}
30+
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import jdk.nashorn.api.scripting.NashornScriptEngine;
4+
5+
import javax.script.ScriptEngineManager;
6+
import javax.script.ScriptException;
7+
import java.util.concurrent.TimeUnit;
8+
9+
/**
10+
* @author Benjamin Winterberg
11+
*/
12+
public class Nashorn10 {
13+
14+
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
15+
NashornScriptEngine engine = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn");
16+
engine.eval("load('java8-nashorn/src/main/resources/nashorn10.js')");
17+
18+
long t0 = System.nanoTime();
19+
20+
for (int i = 0; i < 100000; i++) {
21+
engine.invokeFunction("testPerf");
22+
}
23+
24+
long took = System.nanoTime() - t0;
25+
System.out.format("Elapsed time: %d ms", TimeUnit.NANOSECONDS.toMillis(took));
26+
}
27+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import jdk.nashorn.api.scripting.NashornScriptEngine;
4+
5+
import javax.script.Bindings;
6+
import javax.script.ScriptContext;
7+
import javax.script.ScriptEngineManager;
8+
import javax.script.ScriptException;
9+
import javax.script.SimpleBindings;
10+
import javax.script.SimpleScriptContext;
11+
12+
/**
13+
* @author Benjamin Winterberg
14+
*/
15+
public class Nashorn11 {
16+
17+
public static void main(String[] args) throws Exception {
18+
// test1();
19+
// test2();
20+
// test3();
21+
// test4();
22+
// test5();
23+
// test6();
24+
// test7();
25+
test8();
26+
}
27+
28+
private static void test8() throws ScriptException {
29+
NashornScriptEngine engine = createEngine();
30+
31+
engine.eval("var obj = { foo: 23 };");
32+
33+
ScriptContext defaultContext = engine.getContext();
34+
Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE);
35+
36+
SimpleScriptContext context1 = new SimpleScriptContext();
37+
context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE);
38+
39+
SimpleScriptContext context2 = new SimpleScriptContext();
40+
context2.getBindings(ScriptContext.ENGINE_SCOPE).put("obj", defaultBindings.get("obj"));
41+
42+
engine.eval("obj.foo = 44;", context1);
43+
engine.eval("print(obj.foo);", context1);
44+
engine.eval("print(obj.foo);", context2);
45+
}
46+
47+
private static void test7() throws ScriptException {
48+
NashornScriptEngine engine = createEngine();
49+
50+
engine.eval("var foo = 23;");
51+
52+
ScriptContext defaultContext = engine.getContext();
53+
Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE);
54+
55+
SimpleScriptContext context1 = new SimpleScriptContext();
56+
context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE);
57+
58+
SimpleScriptContext context2 = new SimpleScriptContext();
59+
context2.getBindings(ScriptContext.ENGINE_SCOPE).put("foo", defaultBindings.get("foo"));
60+
61+
engine.eval("foo = 44;", context1);
62+
engine.eval("print(foo);", context1);
63+
engine.eval("print(foo);", context2);
64+
}
65+
66+
private static void test6() throws ScriptException {
67+
NashornScriptEngine engine = createEngine();
68+
69+
ScriptContext defaultContext = engine.getContext();
70+
defaultContext.getBindings(ScriptContext.GLOBAL_SCOPE).put("foo", "hello");
71+
72+
ScriptContext customContext = new SimpleScriptContext();
73+
customContext.setBindings(defaultContext.getBindings(ScriptContext.ENGINE_SCOPE), ScriptContext.ENGINE_SCOPE);
74+
75+
Bindings bindings = new SimpleBindings();
76+
bindings.put("foo", "world");
77+
customContext.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
78+
79+
// engine.eval("foo = 23;"); // overrides foo in all contexts, why???
80+
81+
engine.eval("print(foo)"); // hello
82+
engine.eval("print(foo)", customContext); // world
83+
engine.eval("print(foo)", defaultContext); // hello
84+
}
85+
86+
private static void test5() throws ScriptException {
87+
NashornScriptEngine engine = createEngine();
88+
89+
engine.eval("var obj = { foo: 'foo' };");
90+
engine.eval("function printFoo() { print(obj.foo) };");
91+
92+
ScriptContext defaultContext = engine.getContext();
93+
Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE);
94+
95+
SimpleScriptContext context1 = new SimpleScriptContext();
96+
context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE);
97+
98+
SimpleScriptContext context2 = new SimpleScriptContext();
99+
context2.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE);
100+
101+
engine.eval("obj.foo = 'bar';", context1);
102+
engine.eval("printFoo();", context1);
103+
engine.eval("printFoo();", context2);
104+
}
105+
106+
private static void test4() throws ScriptException {
107+
NashornScriptEngine engine = createEngine();
108+
109+
engine.eval("function foo() { print('bar') };");
110+
111+
ScriptContext defaultContext = engine.getContext();
112+
Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE);
113+
114+
SimpleScriptContext context = new SimpleScriptContext();
115+
context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE);
116+
117+
engine.eval("foo();", context);
118+
System.out.println(context.getAttribute("foo"));
119+
}
120+
121+
private static void test3() throws ScriptException {
122+
NashornScriptEngine engine = createEngine();
123+
124+
ScriptContext defaultContext = engine.getContext();
125+
Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE);
126+
127+
SimpleScriptContext context = new SimpleScriptContext();
128+
context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE);
129+
130+
engine.eval("function foo() { print('bar') };", context);
131+
engine.eval("foo();", context);
132+
133+
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
134+
System.out.println(bindings.get("foo"));
135+
System.out.println(context.getAttribute("foo"));
136+
}
137+
138+
private static void test2() throws ScriptException {
139+
NashornScriptEngine engine = createEngine();
140+
engine.eval("function foo() { print('bar') };");
141+
142+
SimpleScriptContext context = new SimpleScriptContext();
143+
engine.eval("print(Function);", context);
144+
engine.eval("foo();", context);
145+
}
146+
147+
private static void test1() throws ScriptException {
148+
NashornScriptEngine engine = createEngine();
149+
engine.eval("function foo() { print('bar') };");
150+
engine.eval("foo();");
151+
}
152+
153+
private static NashornScriptEngine createEngine() {
154+
return (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn");
155+
}
156+
157+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import jdk.nashorn.api.scripting.ScriptObjectMirror;
4+
5+
import javax.script.ScriptEngine;
6+
import javax.script.ScriptEngineManager;
7+
import java.io.FileReader;
8+
import java.util.Arrays;
9+
10+
/**
11+
* Calling java methods from javascript with nashorn.
12+
*
13+
* @author Benjamin Winterberg
14+
*/
15+
public class Nashorn2 {
16+
17+
public static String fun(String name) {
18+
System.out.format("Hi there from Java, %s", name);
19+
return "greetings from java";
20+
}
21+
22+
public static void fun2(Object object) {
23+
System.out.println(object.getClass());
24+
}
25+
26+
public static void fun3(ScriptObjectMirror mirror) {
27+
System.out.println(mirror.getClassName() + ": " + Arrays.toString(mirror.getOwnKeys(true)));
28+
}
29+
30+
public static void fun4(ScriptObjectMirror person) {
31+
System.out.println("Full Name is: " + person.callMember("getFullName"));
32+
}
33+
34+
public static void main(String[] args) throws Exception {
35+
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
36+
engine.eval(new FileReader("java8-nashorn/src/main/resources/nashorn2.js"));
37+
}
38+
39+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import javax.script.ScriptEngine;
4+
import javax.script.ScriptEngineManager;
5+
6+
/**
7+
* Working with java types from javascript.
8+
*
9+
* @author Benjamin Winterberg
10+
*/
11+
public class Nashorn3 {
12+
13+
public static void main(String[] args) throws Exception {
14+
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
15+
engine.eval("load('java8-nashorn/src/main/resources/nashorn3.js')");
16+
}
17+
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import javax.script.ScriptEngine;
4+
import javax.script.ScriptEngineManager;
5+
6+
/**
7+
* Working with java types from javascript.
8+
*
9+
* @author Benjamin Winterberg
10+
*/
11+
public class Nashorn4 {
12+
13+
public static void main(String[] args) throws Exception {
14+
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
15+
engine.eval("loadWithNewGlobal('java8-nashorn/src/main/resources/nashorn4.js')");
16+
}
17+
18+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import javax.script.Invocable;
4+
import javax.script.ScriptEngine;
5+
import javax.script.ScriptEngineManager;
6+
7+
/**
8+
* Bind java objects to custom javascript objects.
9+
*
10+
* @author Benjamin Winterberg
11+
*/
12+
public class Nashorn5 {
13+
14+
public static void main(String[] args) throws Exception {
15+
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
16+
engine.eval("load('java8-nashorn/src/main/resources/nashorn5.js')");
17+
18+
Invocable invocable = (Invocable) engine;
19+
20+
Product product = new Product();
21+
product.setName("Rubber");
22+
product.setPrice(1.99);
23+
product.setStock(1037);
24+
25+
Object result = invocable.invokeFunction("getValueOfGoods", product);
26+
System.out.println(result);
27+
}
28+
29+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.github.biezhi.java8.nashorn;
2+
3+
import jdk.nashorn.api.scripting.ScriptObjectMirror;
4+
5+
import javax.script.Invocable;
6+
import javax.script.ScriptEngine;
7+
import javax.script.ScriptEngineManager;
8+
9+
/**
10+
* Using Backbone Models from Nashorn.
11+
*
12+
* @author Benjamin Winterberg
13+
*/
14+
public class Nashorn6 {
15+
16+
public static void main(String[] args) throws Exception {
17+
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
18+
engine.eval("load('java8-nashorn/src/main/resources/nashorn6.js')");
19+
20+
Invocable invocable = (Invocable) engine;
21+
22+
Product product = new Product();
23+
product.setName("Rubber");
24+
product.setPrice(1.99);
25+
product.setStock(1337);
26+
27+
ScriptObjectMirror result = (ScriptObjectMirror)
28+
invocable.invokeFunction("calculate", product);
29+
System.out.println(result.get("name") + ": " + result.get("valueOfGoods"));
30+
}
31+
32+
public static void getProduct(ScriptObjectMirror result) {
33+
System.out.println(result.get("name") + ": " + result.get("valueOfGoods"));
34+
}
35+
36+
}

0 commit comments

Comments
 (0)