基本上我希望获得与调用相同的效果:
ScriptEngineManager::put(String key, Object value)
但对于 Java 类型。类似于:
ScriptEngineManager::put(String key, Class<?> clazz)
例如,在调用后:
scriptEngineManager.put("MyClass", MyClass.class)
我将能够做到:
ScriptEngine engine = scriptEngineManager.getEngineByName("nashorn");
engine.eval("MyClass.myStaticMethod();")
可能吗?
谢谢!
最佳答案
是的,可以调用 Java 静态
方法。也许有更简单的方法,但我想出了以下方法。
假设您有 2 个 Java 类 Adder
和 Arithm
:
public class JSNashorn {
public static class Adder {
int total=0;
public Adder() {}
public int add(int x) { return total+=x;}
public int getTotal() { return total;}
}
public static class Arithm {
public static int sum(int a, int b) {
return a+b;
}
public static int mul(int a, int b) {
return a*b;
}
}
//...
}
初始化JS引擎:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine jsEngine = factory.getEngineByName("nashorn");
Invocable iv = (Invocable)jsEngine;
为了在实例上调用 Java 方法:
jsEngine.eval("function makeJsObject(nativeObject) { return {nativeObject:nativeObject}; };");
Object adder = iv.invokeFunction("makeJsObject", new Adder());
jsEngine.put("adder", adder);
jsEngine.eval("adder.add = function(x) { return this.nativeObject.add(x); };");
System.out.println("add: "+iv.invokeMethod(adder, "add", 67));
System.out.println("add: "+iv.invokeMethod(adder, "add", 33));
此打印:
add: 67
add: 100
现在对于静态
方法:
jsEngine.eval("function makeJsClass(nativeClass) { return Java.type(nativeClass); };");
Object arithm = iv.invokeFunction("makeJsClass", "JSNashorn$Arithm");
jsEngine.put("arithm", arithm);
jsEngine.eval("sum = function(x,y) { return arithm.sum(x,y); };");
jsEngine.eval("mul = function(x,y) { return arithm.mul(x,y); };");
System.out.println("sum: "+iv.invokeFunction("sum", 100, -2));
System.out.println("mul: "+iv.invokeFunction("mul", 100, -2));
此打印:
sum: 98
mul: -200
关于java - 如何从 java 将 Java 类型添加到 nashorn 引擎全局作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860068/