Я хочу предоставить собственную реализацию JSObject, как описано здесь: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions JSObject находится в пакете jdk.nashorn.api. К сожалению, классы объектов, которые вы получаете в api-методах, не являются. Вы получаете NativeArray и JO4, которые являются частью внутреннего пакета. Мой вопрос: как мне обращаться с такими объектами? Рекомендуется ли использовать внутренние функции? Или можно ли отнести эти объекты на что-либо в api-пакете?Как избежать внутренних классов Nashorn в реализациях JSObject
Вот мой простой пример:
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import jdk.nashorn.api.scripting.AbstractJSObject;
public class JacksonToJSObject extends AbstractJSObject {
final static ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
String script = "var fun = function(obj) {obj.arrayField = [1,2]; obj.objField = {\"field\":\"test\"}};";
engine.eval(script);
((Invocable)engine).invokeFunction("fun", new JacksonToJSObject());
}
@Override
public void setMember(String name, Object value) {
System.out.println(value.getClass().getCanonicalName());
}
}
Это выход
jdk.nashorn.internal.objects.NativeArray
jdk.nashorn.internal.scripts.JO4
1. Обычно внутренние двигатели возвращают объект, полученный из класса в контракте, и это нормально, его можно отнести к «базовому» классу. Отказ от ответственности: я не знаю, что это случай Yoyr, т. Е. J04 получается из JSObject –
2. Я не знаю, как эффективно «подключить» ваш класс к двигателю (возможно, вы задали вопрос 2in1). В Groovy аналогичная работа имеет динамический характер. –
К сожалению, внутренняя классы не подклассы JSObject, а также никакой другой класс в api. – Gregor