gpt4 book ai didi

javascript - 将 toString 方法暴露给 nashorn 中的 js 对象

转载 作者:行者123 更新时间:2023-12-02 03:38:12 24 4
gpt4 key购买 nike

可能是个愚蠢的问题,但我找不到任何有关它的直接文档,所以就在这里。

我想向 JS 端公开一个 Java“构造函数”,实例化时它应该创建一个带有“toString”方法的实例。

// java class
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import jdk.nashorn.api.scripting.AbstractJSObject;

public class Foo extends AbstractJSObject {
String bar;

public Foo() {
super();
}

public Foo(String b) {
super();
this.bar = b;
}

@Override
public Object newObject(Object... args) {
String bar = null;
if (args[0] != null) bar = args[0].toString();

Foo f = new Foo(bar);
return f;
}

@Override
public String toString() {
return "Foo: " + this.bar;
}


public static void main(String[] args) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.put("foo", new Foo());

// f.toString however is null
engine.eval("var f = new foo('hi'); f.toString();")
}
}

最佳答案

如果您实现 JSObject,nashorn 将路由所有属性/索引访问,通过 JSObject 方法(如 getMember、getSlot、setMember、setSlot、call 方法)进行调用。我稍微修改了您的代码,将“toString”公开为 Foo 对象的属性,并使其可编译和可运行代码:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import jdk.nashorn.api.scripting.AbstractJSObject;
import java.util.function.Supplier;

public class Foo extends AbstractJSObject {
String bar;

public Foo() {
super();
}

public Foo(String b) {
super();
this.bar = b;
}

@Override
public Object newObject(Object... args) {
String bar = null;
if (args[0] != null) bar = args[0].toString();

Foo f = new Foo(bar);
return f;
}

@Override
public Object getMember(String name) {
if (name.equals("toString")) {
// Returning a lambda function as value of this property.
// nashorn code can call lambdas just like script functions!
// You may also choose to return another JSObject that
// returns true in isFunction() method and implements "call"
// as well.

return (Supplier<String>)this::toString;
} else {
// implement other exposed properties here.
return null;
}
}

@Override
public String toString() {
return "Foo: " + this.bar;
}


public static void main(String[] args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.put("foo", new Foo());

// f.toString() would call getMember("toString") and the
// returning lambda is called!

engine.eval("var f = new foo('hi'); print(f.toString());");
}
}

关于javascript - 将 toString 方法暴露给 nashorn 中的 js 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37175060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com