【问题标题】:Scala JSR 223 importing types/classesScala JSR 223 导入类型/类
【发布时间】:2015-02-06 11:38:25
【问题描述】:

以下示例失败,因为找不到Stuff 的定义:

package com.example

import javax.script.ScriptEngineManager

object Driver5 extends App {
  case class Stuff(s: String, d: Double)
  val e = new ScriptEngineManager().getEngineByName("scala")
  println(e.eval("""import Driver5.Stuff; Stuff("Hello", 3.14)"""))
}

我找不到任何允许我在eval 语句中使用我自己的类的导入语句。难道我做错了什么? eval期间如何使用一个导入类?

编辑:阐明示例代码以引出更直接的答案。

【问题讨论】:

    标签: scala jsr223


    【解决方案1】:

    脚本引擎不知道上下文。它肯定无法访问脚本中的所有局部变量和导入,因为它们在类文件中不可用。 (好吧,变量名可以作为调试信息选择使用,但实际上不可能将它们用于此目的。)

    我不确定是否有专门的 API。不同语言的导入是不同的,因此引入一个适合所有语言的 API 可能很困难。

    您应该能够将导入添加到 eval-ed 字符串。我不确定是否有更好的方法来做到这一点。

    【讨论】:

    • eval 字符串中的导入不起作用——它们根本看不到我项目中的命名空间,几乎就像它们在单独的 JVM 中一样。
    • 所以你的问题不在于进口,而在于可见性。你如何运行脚本?我对类加载器有些怀疑。也许尝试致电new ScriptEngineManager(getClass.getClassLoader)。我不确定这是否有帮助。如果它没有帮助,它将否认我对类加载器的怀疑。
    • 我已经尝试操作脚本引擎构造中使用的类路径对象——没有效果。无参数版本应该使用当前线程的加载器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2011-12-14
    相关资源
    最近更新 更多