当前位置: 首页 > 知识库问答 >
问题:

将Nashorn迁移到GraalVM

何骞尧
2023-03-14

我正在使用OpenJDK 12中的Nashorn JS引擎。纳肖恩似乎遭到了反对。我正在寻找可用的替代方案。我找到了GraalVM,但我不确定这是不是最好的。如何从Java执行GraalVM JavaScript?你有什么例子吗?

Nashorn用的是Java:

 NashornScriptEngineFactory nsef = new NashornScriptEngineFactory();
 ScriptEngine engine = nsef.getScriptEngine( BasicDBObject.class.getClassLoader() );
 final Bindings binding = engine.getContext().getBindings(ScriptContext.ENGINE_SCOPE);

在Nashorn中,我创建了一个WrappedMongoDatabase,它扩展了AbstractJSObject。在那里,我添加了一些“虚拟”方法来模拟MongoDB查询语言,例如getCollection(“persons”)。查找()。。。您知道在GraalVM中替换AbstractJSObject的方法吗?

我查看了ProxyObject,不知何故,我找不到一种方法来覆盖调用(Object thiz,Object…args),就像在AbstractJSObject中一样。

public class WrappedMongoDatabase extends AbstractJSObject {

@Override
public boolean hasMember(String name) {
   return "getCollection".equals( name ) || "createCollection".equals(name)||...;
}

@Override
public Object getMember(final String name) {
   if ( hasMember( name ) ){
       return new AbstractJSObject() {
           @Override
            public Object call(Object thiz, Object... args) {
                switch( name ) {
                    case "getCollection":
                            if (args.length == 1 && args[0] instanceof String) {
                                return getCollection((String) args[0]);
                            }
                            break;
                ...
                }
            }   
        }
   }
}
}

共有2个答案

孟璞
2023-03-14

跟随GraalVM ScriptEngine

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("polyglot.js.allowHostAccess", true);
bindings.put("polyglot.js.allowHostClassLookup", (Predicate<String>) s -> true);
bindings.put("javaObj", new Object());
engine.eval("(javaObj instanceof Java.type('java.lang.Object'));"); // would not work without allowHostAccess and allowHostClassLookup

注意nashorn兼容性模式:

这些选项控制应用于已评估JavaScript代码的沙盒规则,默认情况下设置为false,除非应用程序是在Nashorn兼容模式下启动的(-js.Nashorn compat=true)。

桑璞
2023-03-14

GraalVM是一条可靠的道路。我们已经使用它一段时间了,它运行良好,JavaScript实现比Nashorn(或Rhino)好得多。特别是,它符合ECMA2020,它支持Node要求(那是巨大的!),它表现得更好,等等...

如果您使用的是Nashorn,那么GraalVM是向前迈出的一大步,但它确实需要一些调整,这在GraalVM文档中有很好的介绍。

 类似资料:
  • 问题内容: 将Express.js从版本2更新到了版本3,以下调用中断了,因为它不再存在于V3中: 有一个迁移指南说: (使用中间件+ res.locals) 但是我很困惑如何做到这一点。是否有一个更具体的示例说明如何进行迁移? 相关的SO post: Node.js Express3.0 问题答案: 我有同样的问题 session.user ,只是通过了解该app.use功能必须是固定的, 在

  • 我正试图从maven迁移到gradle,但CheckStyle出现了一个奇怪的错误。 这是我得到的错误 如何让gradle使用最新版本的CheckStyle?值得注意的是,我的使用了maven checkstyle 6.10.1和6.8

  • 我要迁移一个JavaApplet通过JNLP启动,作为一个Java的Web Start应用程序,并遇到一些麻烦/误解... 我得到的资源之一是这样的:6迁移JavaAppletJavaWeb Start和JNLP: 让我们开始吧,但是: 目前,该应用程序是一个小程序(),过去是通过将小程序标记嵌入到HTML中来启动的,小程序标记指的是JNLP。 现在,由于所有浏览器都放弃了对小程序的支持,我应该将

  • Angular 是使用 TypeScript 构建的,并且支持向 Angular 提供元信息的装饰器。 TypeScript 的装饰器会让语法感觉更加“自然”,尽管有可能使用 Angular 没有的功能。

  • 我需要将phpBB3用户迁移到Drupal7。用户必须能够使用他们的phpBB用户名/密码组合在Drupal中进行身份验证。 有没有办法把密码翻译成Drupal7格式?