【问题标题】:Instantiating Rhinoscript Native Objects from Java/Scala从 Java/Scala 实例化 Rhinoscript 原生对象
【发布时间】:2011-12-19 07:42:13
【问题描述】:

我正在尝试提高 javascript sn-p 评估器的性能。这些脚本 sn-ps 可以引用存在于类 json 对象图(IE:Json AST)的字符串键控映射中的任意数量的变量。我正在使用 JDK 1.6 和嵌入式 Rhinoscript 引擎 (v1.6R2)。

目前,处理采用以下形式:

  1. 解析片段以发现引用变量的名称
  2. 从映射中检索变量并序列化为 json 字符串
  3. Json 字符串在脚本开头被分配给一个类似命名的变量
  4. 评估增强脚本

我试图弄清楚如何跳过 json 序列化阶段并创建直接的 Rhinoscript 原生对象以放置在脚本的“绑定”中。所需的步骤是:

  1. 解析片段以发现引用变量的名称
  2. 从地图中检索变量并转换为原生 Rhinoscript 等效项
  3. 原生对象被放置在绑定中
  4. 使用所述绑定评估原始脚本

你知道在哪里可以找到有关如何实例化原生 rhinoscript 对象的文档或示例?

如果您想修改,我的 scala 学习项目可能会有一些用处。我想出的任何答案也应该出现在那里......

http://subversion.assembla.com/svn/freshcode_public/learn_scala/datastore/src/test/scala/pkg/script

提前致谢。

【问题讨论】:

  • 如果我遗漏了一些重要的东西,我很抱歉,但是为什么要直接使用 rhino 而不是 scala 解释器呢?
  • 我正在运行时在 servlet 容器中评估 javascript。这不是开发练习,而是我们产品的一个功能,并且 scala 解释器不可用。不过谢谢你的提问。
  • 仅供参考,关于access to Maps/Lists的类似问题

标签: java scala native rhino instantiation


【解决方案1】:

因此,经过一番折腾,我想出了一个合适的解决方案,尽管它没有产生我所希望的性能提升(仅快 10%)。

解决方案特定于 Scala / Lift / Json,包含在 ScriptingUtil.scala 文件中。

总结一下:

  1. Context.javaToJs() 似乎并非在所有情况下都有效。 (java.lang.RuntimeException: No Context associated with current Thread)
  2. 需要Scriptable 类型的“范围”对象。我想出的解决方案并不漂亮,但很有效。
  3. 创建一个 NativeArray:

    val na = new NativeArray(arr)
    na.setPrototype(ScriptableObject.getClassPrototype(scope, "Array"))
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多