java - CompiledScript 的多个实例
问题描述
我正在通过 ScriptEngine 加载 Scala 脚本并使用 CompiledScript 来评估脚本。
我正在使用 Java 接口将 Scala 脚本映射到 java 端,如下所示。
Java接口:
public interface SomeInterface {
void method1();
}
斯卡拉脚本:
class ScalaImp extends SomeInterface {
override def method1() : Unit = {
//Implementation
}
}
加载类型对象的代码SomeInterface
如下。
String extension = path.getFileName().toString();
extension = extension.substring(extension.lastIndexOf(".") > 0 ? extension.lastIndexOf(".") + 1 : 0);
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension(extension);
File file = path.toFile();
if (file.exists() && file.isFile()) {
SomeInterface mappingInterface = null;
SomeInterface mappingInterface2 = null;
try(FileReader fr = new FileReader(file)) {
Compilable compilable = (Compilable)engine;
CompiledScript compiledScript = compilable.compile(fr);
mappingInterface = (SomeInterface)compiledScript.eval();
mappingInterface2 = (SomeInterface)compiledScript.eval(); //This fails. Any alternative for this?
}
catch (FileSystemException e) {
logger.error("Cannot load file");
}
return mappingInterface;
}
我想创建脚本的多个实例。但是上面的代码给出了以下错误:Failed to load '$line6.$eval': $line6.$eval
在第二次eval()
调用时。我知道我可以使用多个 CompiledScript 实例并单独评估。但是编译时间过长,超出了程序的性能预期。
无论如何,我可以用一个 CompiledScript 实例创建同一个脚本的多个实例吗?
解决方案
并不真地。它通过使用 REPL 工作,它始终编译以评估 2.12 及更早版本中的代码。
可能您正在尝试:
$ scala
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.
scala> val s = scala.tools.nsc.interpreter.Scripted()
s: scala.tools.nsc.interpreter.Scripted = scala.tools.nsc.interpreter.Scripted@432f4626
scala> s.eval("class C")
res0: Object = null
scala> val c = s.compile("new C")
c: javax.script.CompiledScript = scala.tools.nsc.interpreter.Scripted$WrappedRequest@13346a64
scala> c.eval()
res1: Object = C@2d093067
scala> c.eval()
res2: Object = C@2693e39c
可以观察编译工作:
scala> s.intp.settings.Xprint.value_=(List("typer"))
在第二个 eval 中,它重用了包装用户代码的类,但它编译了一个转发定义的新包装器。看起来有一个错误,它试图同时转发值定义和类型;在这种情况下,类定义不起作用。
可能您不打算定义两个不同的类,而是返回同一个类的两个实例,如图所示?
推荐阅读
- javascript - 您可以在浏览器上安全地使用 String.trim() 还是应该添加 shim?
- python - 需要了解 `yield` 如何为 `pytest` 工作?
- python - 使用 Flask 链接到网站中的另一个页面
- arduino - 有理由不直接打印 uint64_t 吗?
- r - 只在 RStudio 中阅读自制的 r 包
- c++ - 无法让变量相互交互(C++)
- crystal-reports - 在水晶报告中总结来自两个不同组的详细信息
- php - Wordpress woocommerce 无法获取产品项目数据
- samsung-mobile - 将照片保存到云端
- wordpress - 将主题移动到 Web 服务器后出现未定义的函数错误