gpt4 book ai didi

javascript - 当我有一个代表 JS 函数的对象时,Java Nashorn 在 Java 中创建 JS 对象

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

我有一个基类,它将 Entity 作为其构造函数参数。我在 JavaScript 中扩展了这个基类,它看起来像这样:

Java.extend(BaseClass, {
someAbstractMethod : function() { ... },
someAdditionalField : ...,
etc
})

据我所知,如果我有 Java 对象的实例,我就无法使用附加字段/方法,但如果它是 JavaScript 对象,我就可以。那么如何用Java代码将这个类实例化为JS对象呢?

public class ScriptedEntity extends Entity implements Scripted<EntityScriptFunctions> {

private CompiledScript script;
private Object implemented_script_class;
private Object my_script_instance;
private Invocable invocable;

public ScriptedEntity(float x, float y, CompiledScript script) {
super(x, y);
invocable = (Invocable) script.getEngine();
try {
implemented_script_class = script.eval();
my_script_instance = invocable.invokeFunction("???", this); //'this' is the constructor argument
} catch (ScriptException | IllegalArgumentException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}

...

}

最佳答案

是的,使用Java.extend,您只能重写父类(super class)方法。您无法向生成的子类添加新的 Java 字段或新的 Java 方法。

如果您的问题是关于如何从 Java 代码中执行相当于 JS“new”的 javascript 函数,那么:

import javax.script.*;
import jdk.nashorn.api.scripting.*;

public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
e.eval("function Point(x, y) { this.x = x; this.y = y}");
JSObject pointFunc = (JSObject)e.get("Point");
JSObject pointObj = (JSObject)pointFunc.newObject(43, 55);
System.out.println(pointFunc.isInstance(pointObj));
System.out.println(pointObj.getMember("x"));
System.out.println(pointObj.getMember("y"));
}
}

另请参阅:https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html

要创建使用 Java.extend 定义的 Java 子类的实例,您可以定义一个将创建 Java 对象的脚本函数。您可以通过 Invocable.invokeFunction 或 JSObject.call 从 Java 代码调用该函数。

import java.util.*;
import javax.script.*;
import jdk.nashorn.api.scripting.*;

public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
e.eval("var MyHashMap = Java.extend(java.util.HashMap, {})");
e.eval("function createMyHashMap() { return new MyHashMap(); }");
HashMap hm = (HashMap) ((Invocable)e).invokeFunction("createMyHashMap");
System.out.println(hm);
}
}

关于javascript - 当我有一个代表 JS 函数的对象时,Java Nashorn 在 Java 中创建 JS 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38241449/

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